kpartx: Improve reliability of find_loop_by_file()
authorBart Van Assche <bart.vanassche@wdc.com>
Wed, 7 Mar 2018 23:15:47 +0000 (00:15 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Sat, 10 Mar 2018 07:23:00 +0000 (08:23 +0100)
Avoid that the strchr() call in this function examines uninitialized
data on the stack. This patch avoids that Coverity reports the following:

    CID 173252:  Error handling issues  (CHECKED_RETURN)
    "read(int, void *, size_t)" returns the number of bytes read, but it is ignored.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
kpartx/lopart.c

index 02b29e8..69c1eda 100644 (file)
@@ -64,7 +64,7 @@ char *find_loop_by_file(const char *filename)
        DIR *dir;
        struct dirent *dent;
        char dev[64], *found = NULL, *p;
-       int fd;
+       int fd, bytes_read;
        struct stat statbuf;
        struct loop_info loopinfo;
        const char VIRT_BLOCK[] = "/sys/devices/virtual/block";
@@ -86,14 +86,15 @@ char *find_loop_by_file(const char *filename)
                if (fd < 0)
                        continue;
 
-               if (read(fd, dev, sizeof(dev)) <= 0) {
+               bytes_read = read(fd, dev, sizeof(dev) - 1);
+               if (bytes_read <= 0) {
                        close(fd);
                        continue;
                }
 
                close(fd);
 
-               dev[sizeof(dev)-1] = '\0';
+               dev[bytes_read] = '\0';
                p = strchr(dev, '\n');
                if (p != NULL)
                        *p = '\0';