[efi] Provide efi_devpath_len()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/41/head
Michael Brown 2015-09-10 23:22:43 +01:00
parent 4a7d691697
commit 7107334391
6 changed files with 19 additions and 17 deletions

View File

@ -1492,15 +1492,14 @@ static int usbio_path ( struct usbio_device *usbio ) {
path = u.interface; path = u.interface;
/* Locate end of device path and sanity check */ /* Locate end of device path and sanity check */
end = efi_devpath_end ( path ); len = efi_devpath_len ( path );
len = ( ( ( void * ) end ) - ( ( void * ) path ) );
if ( len < sizeof ( *usbpath ) ) { if ( len < sizeof ( *usbpath ) ) {
DBGC ( usbio, "USBIO %s underlength device path\n", DBGC ( usbio, "USBIO %s underlength device path\n",
efi_handle_name ( handle ) ); efi_handle_name ( handle ) );
rc = -EINVAL; rc = -EINVAL;
goto err_underlength; goto err_underlength;
} }
usbpath = ( ( ( void * ) end ) - sizeof ( *usbpath ) ); usbpath = ( ( ( void * ) path ) + len - sizeof ( *usbpath ) );
if ( ! ( ( usbpath->Header.Type == MESSAGING_DEVICE_PATH ) && if ( ! ( ( usbpath->Header.Type == MESSAGING_DEVICE_PATH ) &&
( usbpath->Header.SubType == MSG_USB_DP ) ) ) { ( usbpath->Header.SubType == MSG_USB_DP ) ) ) {
DBGC ( usbio, "USBIO %s not a USB device path: ", DBGC ( usbio, "USBIO %s not a USB device path: ",

View File

@ -73,8 +73,7 @@ efi_image_path ( struct image *image, EFI_DEVICE_PATH_PROTOCOL *parent ) {
size_t len; size_t len;
/* Calculate device path lengths */ /* Calculate device path lengths */
end = efi_devpath_end ( parent ); prefix_len = efi_devpath_len ( parent );
prefix_len = ( ( void * ) end - ( void * ) parent );
name_len = strlen ( image->name ); name_len = strlen ( image->name );
filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH + filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
( name_len + 1 /* NUL */ ) * sizeof ( wchar_t ) ); ( name_len + 1 /* NUL */ ) * sizeof ( wchar_t ) );

View File

@ -15,6 +15,7 @@ struct device;
extern EFI_DEVICE_PATH_PROTOCOL * extern EFI_DEVICE_PATH_PROTOCOL *
efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path ); efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path );
extern size_t efi_devpath_len ( EFI_DEVICE_PATH_PROTOCOL *path );
extern int efi_locate_device ( EFI_HANDLE device, EFI_GUID *protocol, extern int efi_locate_device ( EFI_HANDLE device, EFI_GUID *protocol,
EFI_HANDLE *parent ); EFI_HANDLE *parent );
extern int efi_child_add ( EFI_HANDLE parent, EFI_HANDLE child ); extern int efi_child_add ( EFI_HANDLE parent, EFI_HANDLE child );

View File

@ -359,9 +359,6 @@ const __attribute__ (( pure )) char *
efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) { efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices; EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
static char text[256]; static char text[256];
void *start;
void *end;
size_t max_len;
size_t len; size_t len;
CHAR16 *wtext; CHAR16 *wtext;
@ -374,13 +371,8 @@ efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
/* If we have no DevicePathToText protocol then use a raw hex string */ /* If we have no DevicePathToText protocol then use a raw hex string */
if ( ! efidpt ) { if ( ! efidpt ) {
DBG ( "[No DevicePathToText]" ); DBG ( "[No DevicePathToText]" );
start = path; len = efi_devpath_len ( path );
end = efi_devpath_end ( path ); base16_encode ( path, len, text, sizeof ( text ) );
len = ( end - start );
max_len = ( ( sizeof ( text ) - 1 /* NUL */ ) / 2 /* "xx" */ );
if ( len > max_len )
len = max_len;
base16_encode ( start, len, text, sizeof ( text ) );
return text; return text;
} }

View File

@ -1033,8 +1033,7 @@ static int efi_snp_probe ( struct net_device *netdev ) {
} }
/* Allocate the new device path */ /* Allocate the new device path */
path_end = efi_devpath_end ( path.path ); path_prefix_len = efi_devpath_len ( path.path );
path_prefix_len = ( ( ( void * ) path_end ) - ( ( void * ) path.path ));
snpdev->path = zalloc ( path_prefix_len + sizeof ( *macpath ) + snpdev->path = zalloc ( path_prefix_len + sizeof ( *macpath ) +
sizeof ( *path_end ) ); sizeof ( *path_end ) );
if ( ! snpdev->path ) { if ( ! snpdev->path ) {

View File

@ -50,6 +50,18 @@ EFI_DEVICE_PATH_PROTOCOL * efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *path ) {
return path; return path;
} }
/**
* Find length of device path (excluding terminator)
*
* @v path Path to device
* @ret path_len Length of device path
*/
size_t efi_devpath_len ( EFI_DEVICE_PATH_PROTOCOL *path ) {
EFI_DEVICE_PATH_PROTOCOL *end = efi_devpath_end ( path );
return ( ( ( void * ) end ) - ( ( void * ) path ) );
}
/** /**
* Locate parent device supporting a given protocol * Locate parent device supporting a given protocol
* *