]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/path: fix possible leak when use ul_path_read_string() [coverity scan]
authorKarel Zak <kzak@redhat.com>
Fri, 11 Jun 2021 13:43:36 +0000 (15:43 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 11 Jun 2021 13:43:36 +0000 (15:43 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
lib/path.c

index 75fa853058468fddd987c0ad892fb6ff50f51828..058c143f40a6b9128a0e5104c6555f5c76e877a3 100644 (file)
@@ -617,7 +617,7 @@ int ul_path_readf(struct path_cxt *pc, char *buf, size_t len, const char *path,
  * Returns newly allocated buffer with data from file. Maximal size is BUFSIZ
  * (send patch if you need something bigger;-)
  *
- * Returns size of the string!
+ * Returns size of the string without \0, nothing is allocated if returns <= 0.
  */
 int ul_path_read_string(struct path_cxt *pc, char **str, const char *path)
 {
@@ -635,6 +635,8 @@ int ul_path_read_string(struct path_cxt *pc, char **str, const char *path)
        /* Remove tailing newline (usual in sysfs) */
        if (rc > 0 && *(buf + rc - 1) == '\n')
                --rc;
+       if (rc == 0)
+               return 0;
 
        buf[rc] = '\0';
        *str = strdup(buf);
@@ -1191,11 +1193,11 @@ int main(int argc, char *argv[])
                        errx(EXIT_FAILURE, "<file> not defined");
                file = argv[optind++];
 
-               if (ul_path_read_string(pc, &res, file) < 0)
+               if (ul_path_read_string(pc, &res, file) <= 0)
                        err(EXIT_FAILURE, "read string failed");
                printf("read:  %s: %s\n", file, res);
 
-               if (ul_path_readf_string(pc, &res, "%s", file) < 0)
+               if (ul_path_readf_string(pc, &res, "%s", file) <= 0)
                        err(EXIT_FAILURE, "readf string failed");
                printf("readf: %s: %s\n", file, res);