shadow_copy_get_shadow_copy_data: fix GCC snprintf warning
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Thu, 9 Feb 2017 00:02:52 +0000 (13:02 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 10 Feb 2017 04:09:09 +0000 (05:09 +0100)
GCC 7 warns about snprintf truncating a dirent d_name (potentially 255 bytes) to 25 bytes,
even though we have checked that it is 25 long in shadow_copy_match_name().

Using strlcpy instead of snprintf lets us check it again, JUST TO BE SURE.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source3/include/ntioctl.h
source3/modules/vfs_shadow_copy.c

index f9e6dd996a74cd94c247f6688012a45a82be810f..bd80a30d34ae7a4f7c3f85f43ecc150d26b29509 100644 (file)
@@ -30,7 +30,7 @@
 
 
 /* For FSCTL_GET_SHADOW_COPY_DATA ...*/
-typedef char SHADOW_COPY_LABEL[25];
+typedef char SHADOW_COPY_LABEL[25]; /* sizeof("@GMT-2004.02.18-15.44.00") + 1 */
 
 struct shadow_copy_data {
        /* Total number of shadow volumes currently mounted */
index 9b43e85af636f7b621c2cac82417c83bf9317a92..dae70f555e565be7c4515e7e2e063b4b2eed19ad 100644 (file)
@@ -252,6 +252,7 @@ static int shadow_copy_get_shadow_copy_data(vfs_handle_struct *handle,
        while (True) {
                SHADOW_COPY_LABEL *tlabels;
                struct dirent *d;
+               int ret;
 
                d = SMB_VFS_NEXT_READDIR(handle, p, NULL);
                if (d == NULL) {
@@ -280,7 +281,15 @@ static int shadow_copy_get_shadow_copy_data(vfs_handle_struct *handle,
                        return -1;
                }
 
-               snprintf(tlabels[shadow_copy_data->num_volumes++], sizeof(*tlabels), "%s",d->d_name);
+               ret = strlcpy(tlabels[shadow_copy_data->num_volumes], d->d_name,
+                             sizeof(tlabels[shadow_copy_data->num_volumes]));
+               if (ret != sizeof(tlabels[shadow_copy_data->num_volumes]) - 1) {
+                       DEBUG(0,("shadow_copy_get_shadow_copy_data: malformed label %s\n",
+                                d->d_name));
+                       SMB_VFS_NEXT_CLOSEDIR(handle, p);
+                       return -1;
+               }
+               shadow_copy_data->num_volumes++;
 
                shadow_copy_data->labels = tlabels;
        }