btrfs-progs: fix overflows of ioctl name args
authorEric Sandeen <sandeen@redhat.com>
Fri, 25 Jan 2013 19:27:48 +0000 (13:27 -0600)
committerZach Brown <zab@redhat.com>
Wed, 6 Feb 2013 00:09:41 +0000 (16:09 -0800)
3 places where we copy pathnames into ioctl arguments
were not limited to the destination name size, and
could overflow.  Use the new strncpy_null() macro
to make this safe.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
btrfs-vol.c
cmds-receive.c

index ad824bd..3cc1c32 100644 (file)
@@ -159,7 +159,7 @@ int main(int ac, char **av)
        }
        fd = dirfd(dirstream);
        if (device)
-               strcpy(args.name, device);
+               strncpy_null(args.name, device);
        else
                args.name[0] = '\0';
 
index e629174..6688d0c 100644 (file)
@@ -43,6 +43,7 @@
 #include "ctree.h"
 #include "ioctl.h"
 #include "commands.h"
+#include "utils.h"
 #include "list.h"
 
 #include "send.h"
@@ -165,7 +166,7 @@ static int process_subvol(const char *path, const u8 *uuid, u64 ctransid,
        }
 
        memset(&args_v1, 0, sizeof(args_v1));
-       strcpy(args_v1.name, path);
+       strncpy_null(args_v1.name, path);
        ret = ioctl(r->mnt_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1);
        if (ret < 0) {
                ret = -errno;
@@ -213,7 +214,7 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid,
        }
 
        memset(&args_v2, 0, sizeof(args_v2));
-       strcpy(args_v2.name, path);
+       strncpy_null(args_v2.name, path);
 
        r->parent_subvol = subvol_uuid_search(&r->sus, 0, parent_uuid,
                        parent_ctransid, NULL, subvol_search_by_received_uuid);