]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
sysfs: reject reads that use the whole buffer.
authorNeilBrown <neilb@suse.de>
Mon, 6 Jul 2015 03:21:33 +0000 (13:21 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 6 Jul 2015 03:21:33 +0000 (13:21 +1000)
If a read fills the whole buffer, then we possibly
missed something of the end, and we definitely shouldn't
put a '\0' beyond the end, so just return an error.
This should never happen anyway.

Signed-off-by: NeilBrown <neilb@suse.com>
sysfs.c

diff --git a/sysfs.c b/sysfs.c
index 18f3df9a6ec3b5f4eff12011e0f585d265c7d290..726847020acbf0814a8360a1181fd85d0bbdf63a 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -490,7 +490,7 @@ int sysfs_fd_get_ll(int fd, unsigned long long *val)
 
        lseek(fd, 0, 0);
        n = read(fd, buf, sizeof(buf));
 
        lseek(fd, 0, 0);
        n = read(fd, buf, sizeof(buf));
-       if (n <= 0)
+       if (n <= 0 || n == sizeof(buf))
                return -2;
        buf[n] = 0;
        *val = strtoull(buf, &ep, 0);
                return -2;
        buf[n] = 0;
        *val = strtoull(buf, &ep, 0);
@@ -526,7 +526,7 @@ int sysfs_fd_get_two(int fd, unsigned long long *v1, unsigned long long *v2)
 
        lseek(fd, 0, 0);
        n = read(fd, buf, sizeof(buf));
 
        lseek(fd, 0, 0);
        n = read(fd, buf, sizeof(buf));
-       if (n <= 0)
+       if (n <= 0 || n == sizeof(buf))
                return -2;
        buf[n] = 0;
        *v1 = strtoull(buf, &ep, 0);
                return -2;
        buf[n] = 0;
        *v1 = strtoull(buf, &ep, 0);
@@ -562,7 +562,7 @@ int sysfs_fd_get_str(int fd, char *val, int size)
 
        lseek(fd, 0, 0);
        n = read(fd, val, size);
 
        lseek(fd, 0, 0);
        n = read(fd, val, size);
-       if (n <= 0)
+       if (n <= 0 || n == size)
                return -1;
        val[n] = 0;
        return n;
                return -1;
        val[n] = 0;
        return n;
@@ -715,7 +715,7 @@ int sysfs_disk_to_sg(int fd)
        struct stat st;
        char path[256];
        char sg_path[256];
        struct stat st;
        char path[256];
        char sg_path[256];
-       char sg_major_minor[8];
+       char sg_major_minor[10];
        char *c;
        DIR *dir;
        struct dirent *de;
        char *c;
        DIR *dir;
        struct dirent *de;
@@ -750,7 +750,7 @@ int sysfs_disk_to_sg(int fd)
 
        rv = read(fd, sg_major_minor, sizeof(sg_major_minor));
        close(fd);
 
        rv = read(fd, sg_major_minor, sizeof(sg_major_minor));
        close(fd);
-       if (rv < 0)
+       if (rv < 0 || rv == sizeof(sg_major_minor))
                return -1;
        else
                sg_major_minor[rv - 1] = '\0';
                return -1;
        else
                sg_major_minor[rv - 1] = '\0';