Fix: file descriptor leak in get_possible_cpu_mask_from_sysfs
[lttng-ust.git] / src / common / smp.c
index a4346591c4595c0682e757ed700c724f6c74b99b..d7ba23c4f263b2afec7fd906f2cc525fbd745dbd 100644 (file)
@@ -105,14 +105,14 @@ int get_possible_cpu_mask_from_sysfs(char *buf, size_t max_bytes)
 {
        ssize_t bytes_read = 0;
        size_t total_bytes_read = 0;
-       int fd = 0;
+       int fd = -1, ret = -1;
 
        if (buf == NULL)
-               return -1;
+               goto end;
 
        fd = open("/sys/devices/system/cpu/possible", O_RDONLY);
        if (fd < 0)
-               return -1;
+               goto end;
 
        do {
                bytes_read = read(fd, buf + total_bytes_read,
@@ -122,7 +122,7 @@ int get_possible_cpu_mask_from_sysfs(char *buf, size_t max_bytes)
                        if (errno == EINTR) {
                                continue;       /* retry operation */
                        } else {
-                               return -1;
+                               goto end;
                        }
                }
 
@@ -130,9 +130,6 @@ int get_possible_cpu_mask_from_sysfs(char *buf, size_t max_bytes)
                assert(total_bytes_read <= max_bytes);
        } while (max_bytes > total_bytes_read && bytes_read > 0);
 
-       if (close(fd))
-               PERROR("close");
-
        /*
         * Make sure the mask read is a null terminated string.
         */
@@ -141,7 +138,13 @@ int get_possible_cpu_mask_from_sysfs(char *buf, size_t max_bytes)
        else
                buf[max_bytes - 1] = '\0';
 
-       return total_bytes_read;
+       if (total_bytes_read > INT_MAX)
+               goto end;
+       ret = (int) total_bytes_read;
+end:
+       if (fd >= 0 && close(fd) < 0)
+               PERROR("close");
+       return ret;
 }
 
 /*
This page took 0.025178 seconds and 4 git commands to generate.