aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface/efi
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-10-01 18:41:37 +0100
committerMichael Brown <mcb30@ipxe.org>2020-10-01 23:27:53 +0100
commit02201417104c751545dda261eb33f0012703d1ff (patch)
treeee42eeb837abb133d62bcde1d9072144845c7013 /src/interface/efi
parent02280dc642907b908f4b5c7e0d82d8ad1d51d574 (diff)
downloadipxe-02201417104c751545dda261eb33f0012703d1ff.tar.gz
[efi] Fix reporting of USB supported languages array
The length as returned by UsbGetSupportedLanguages() should not include the length of the descriptor header itself. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface/efi')
-rw-r--r--src/interface/efi/efi_usb.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/interface/efi/efi_usb.c b/src/interface/efi/efi_usb.c
index a8c274a57..7f761145f 100644
--- a/src/interface/efi/efi_usb.c
+++ b/src/interface/efi/efi_usb.c
@@ -1044,9 +1044,8 @@ efi_usb_get_supported_languages ( EFI_USB_IO_PROTOCOL *usbio,
DBGC2 ( usbdev, "USBDEV %s get supported languages\n", usbintf->name );
/* Return cached supported languages */
- *languages = ( ( ( void * ) usbdev->languages ) +
- sizeof ( *(usbdev->languages) ) );
- *len = usbdev->languages->len;
+ *languages = usbdev->lang;
+ *len = usbdev->lang_len;
return 0;
}
@@ -1255,7 +1254,9 @@ static int efi_usb_probe ( struct usb_function *func,
struct efi_usb_interface *usbintf;
struct efi_device *efidev;
struct usb_descriptor_header header;
+ struct usb_descriptor_header *lang;
size_t config_len;
+ size_t lang_len;
unsigned int i;
int rc;
@@ -1275,9 +1276,12 @@ static int efi_usb_probe ( struct usb_function *func,
/* Assume no strings are present */
header.len = 0;
}
+ lang_len = ( ( header.len >= sizeof ( header ) ) ?
+ ( header.len - sizeof ( header ) ) : 0 );
/* Allocate and initialise structure */
- usbdev = zalloc ( sizeof ( *usbdev ) + config_len + header.len );
+ usbdev = zalloc ( sizeof ( *usbdev ) + config_len +
+ sizeof ( *lang ) + lang_len );
if ( ! usbdev ) {
rc = -ENOMEM;
goto err_alloc;
@@ -1288,14 +1292,15 @@ static int efi_usb_probe ( struct usb_function *func,
usbdev->efidev = efidev;
usbdev->config = ( ( ( void * ) usbdev ) + sizeof ( *usbdev ) );
memcpy ( usbdev->config, config, config_len );
- usbdev->languages = ( ( ( void * ) usbdev->config ) + config_len );
+ lang = ( ( ( void * ) usbdev->config ) + config_len );
+ usbdev->lang = ( ( ( void * ) lang ) + sizeof ( *lang ) );
+ usbdev->lang_len = lang_len;
INIT_LIST_HEAD ( &usbdev->interfaces );
- /* Get supported languages descriptor */
- if ( header.len &&
- ( rc = usb_get_descriptor ( usb, 0, USB_STRING_DESCRIPTOR, 0, 0,
- usbdev->languages,
- header.len ) ) != 0 ) {
+ /* Get supported languages descriptor, if applicable */
+ if ( lang_len &&
+ ( ( rc = usb_get_descriptor ( usb, 0, USB_STRING_DESCRIPTOR,
+ 0, 0, lang, header.len ) ) != 0 ) ) {
DBGC ( usbdev, "USBDEV %s could not get supported languages: "
"%s\n", usbdev->name, strerror ( rc ) );
goto err_get_languages;