]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Provide efi_devpath_len()
authorMichael Brown <mcb30@ipxe.org>
Thu, 10 Sep 2015 22:22:43 +0000 (23:22 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sun, 13 Sep 2015 11:54:31 +0000 (12:54 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/usb/usbio.c
src/image/efi_image.c
src/include/ipxe/efi/efi_utils.h
src/interface/efi/efi_debug.c
src/interface/efi/efi_snp.c
src/interface/efi/efi_utils.c

index a80f7c8fcce4bf2341535434eb9889e3badddbab..2c15200ce42f2d898402c7800b2d29e549c2b8f6 100644 (file)
@@ -1492,15 +1492,14 @@ static int usbio_path ( struct usbio_device *usbio ) {
        path = u.interface;
 
        /* Locate end of device path and sanity check */
-       end = efi_devpath_end ( path );
-       len = ( ( ( void * ) end ) - ( ( void * ) path ) );
+       len = efi_devpath_len ( path );
        if ( len < sizeof ( *usbpath ) ) {
                DBGC ( usbio, "USBIO %s underlength device path\n",
                       efi_handle_name ( handle ) );
                rc = -EINVAL;
                goto err_underlength;
        }
-       usbpath = ( ( ( void * ) end ) - sizeof ( *usbpath ) );
+       usbpath = ( ( ( void * ) path ) + len - sizeof ( *usbpath ) );
        if ( ! ( ( usbpath->Header.Type == MESSAGING_DEVICE_PATH ) &&
                 ( usbpath->Header.SubType == MSG_USB_DP ) ) ) {
                DBGC ( usbio, "USBIO %s not a USB device path: ",
index 89d57bbda4e74dbd63e6e7d3eeec4d72d202847d..79dfe0664e84338ae77abd8680e0642eb9220827 100644 (file)
@@ -73,8 +73,7 @@ efi_image_path ( struct image *image, EFI_DEVICE_PATH_PROTOCOL *parent ) {
        size_t len;
 
        /* Calculate device path lengths */
-       end = efi_devpath_end ( parent );
-       prefix_len = ( ( void * ) end - ( void * ) parent );
+       prefix_len = efi_devpath_len ( parent );
        name_len = strlen ( image->name );
        filepath_len = ( SIZE_OF_FILEPATH_DEVICE_PATH +
                         ( name_len + 1 /* NUL */ ) * sizeof ( wchar_t ) );
index 57268daf7f85facbf18e35537da6b07f027e8060..67acba17eef232d5c7cd3da5ebb42e49d1b4b579 100644 (file)
@@ -15,6 +15,7 @@ struct device;
 
 extern EFI_DEVICE_PATH_PROTOCOL *
 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,
                               EFI_HANDLE *parent );
 extern int efi_child_add ( EFI_HANDLE parent, EFI_HANDLE child );
index ed18ff92dc2c46a8cea50e632362ede0d9c46af1..069ca3fcf4f8338903928e98190001ba6af30fd8 100644 (file)
@@ -359,9 +359,6 @@ const __attribute__ (( pure )) char *
 efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        static char text[256];
-       void *start;
-       void *end;
-       size_t max_len;
        size_t len;
        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 ( ! efidpt ) {
                DBG ( "[No DevicePathToText]" );
-               start = path;
-               end = efi_devpath_end ( path );
-               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 ) );
+               len = efi_devpath_len ( path );
+               base16_encode ( path, len, text, sizeof ( text ) );
                return text;
        }
 
index 2ff1e974932802b732ffc799c5902abc964e3d4f..5729a39c1e7582c804dc2724f9e7e02bde09696d 100644 (file)
@@ -1033,8 +1033,7 @@ static int efi_snp_probe ( struct net_device *netdev ) {
        }
 
        /* Allocate the new device path */
-       path_end = efi_devpath_end ( path.path );
-       path_prefix_len = ( ( ( void * ) path_end ) - ( ( void * ) path.path ));
+       path_prefix_len = efi_devpath_len ( path.path );
        snpdev->path = zalloc ( path_prefix_len + sizeof ( *macpath ) +
                                sizeof ( *path_end ) );
        if ( ! snpdev->path ) {
index 1bebaa56d1625ef9c5528c5166c3ed04d738d0f9..4dc75414c0ff4d0420abc89df26e5322f3b814ec 100644 (file)
@@ -50,6 +50,18 @@ EFI_DEVICE_PATH_PROTOCOL * efi_devpath_end ( EFI_DEVICE_PATH_PROTOCOL *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
  *