On 7/25/19 7:22 AM, Liu, Changcheng wrote:
GCC8 started emitting warning about using strncpy with number of bytes
exactly equal destination size which could lead to non-zero terminated
string being copied. Use "SYSFS_PATH_MAX - 1" & "SYSFS_BUS_ID_SIZE - 1"
as number of bytes to ensure name is always zero-terminated.

Signed-off-by: Changcheng Liu <changcheng....@aliyun.com>
---
v1 -> v2:
  * Correct array tail index
---
  tools/usb/usbip/libsrc/usbip_common.c        | 6 ++++--
  tools/usb/usbip/libsrc/usbip_device_driver.c | 6 ++++--
  2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/tools/usb/usbip/libsrc/usbip_common.c 
b/tools/usb/usbip/libsrc/usbip_common.c
index bb424638d75b..b8d7d480595a 100644
--- a/tools/usb/usbip/libsrc/usbip_common.c
+++ b/tools/usb/usbip/libsrc/usbip_common.c
@@ -226,8 +226,10 @@ int read_usb_device(struct udev_device *sdev, struct 
usbip_usb_device *udev)
        path = udev_device_get_syspath(sdev);
        name = udev_device_get_sysname(sdev);
- strncpy(udev->path, path, SYSFS_PATH_MAX);
-       strncpy(udev->busid, name, SYSFS_BUS_ID_SIZE);
+       strncpy(udev->path,  path,  SYSFS_PATH_MAX - 1);
+       udev->path[SYSFS_PATH_MAX - 1] = '\0';
+       strncpy(udev->busid, name, SYSFS_BUS_ID_SIZE - 1);
+       udev->busid[SYSFS_BUS_ID_SIZE - 1] = '\0';

strlcpy() would be better choice here. Any reason to not use that?

sscanf(name, "%u-%u", &busnum, &devnum);
        udev->busnum = busnum;
diff --git a/tools/usb/usbip/libsrc/usbip_device_driver.c 
b/tools/usb/usbip/libsrc/usbip_device_driver.c
index 5a3726eb44ab..051d7d3f443b 100644
--- a/tools/usb/usbip/libsrc/usbip_device_driver.c
+++ b/tools/usb/usbip/libsrc/usbip_device_driver.c
@@ -91,7 +91,8 @@ int read_usb_vudc_device(struct udev_device *sdev, struct 
usbip_usb_device *dev)
        copy_descr_attr16(dev, &descr, idProduct);
        copy_descr_attr16(dev, &descr, bcdDevice);
- strncpy(dev->path, path, SYSFS_PATH_MAX);
+       strncpy(dev->path, path, SYSFS_PATH_MAX - 1);
+       dev->path[SYSFS_PATH_MAX - 1] = '\0';
dev->speed = USB_SPEED_UNKNOWN;
        speed = udev_device_get_sysattr_value(sdev, "current_speed");
@@ -110,7 +111,8 @@ int read_usb_vudc_device(struct udev_device *sdev, struct 
usbip_usb_device *dev)
        dev->busnum = 0;
name = udev_device_get_sysname(plat);
-       strncpy(dev->busid, name, SYSFS_BUS_ID_SIZE);
+       strncpy(dev->busid, name, SYSFS_BUS_ID_SIZE - 1);
+       dev->busid[SYSFS_BUS_ID_SIZE - 1] = '\0';

strlcpy() would be better choice here. Any reason to not use that?

        return 0;
  err:
        fclose(fd);


thanks,
-- Shuah

Reply via email to