]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
ipcs: make sure to parse whole lines for shm_data
authorRuediger Meier <ruediger.meier@ga-group.nl>
Fri, 18 Mar 2016 11:49:17 +0000 (12:49 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 18 Mar 2016 14:38:05 +0000 (15:38 +0100)
We want to parse 16 columns _per_row_ without mixing them up. The
existing code is unsafe for more or less columns and could even
run into endless loops. This patch assures that we parse row-wise
and really skip lines with columns != 16.

Probably somehow we could have also done this with fscanf() only.
Using fgets() additionally makes the code more easy to read and
to improve later.

Signed-off-by: Ruediger Meier <ruediger.meier@ga-group.nl>
sys-utils/ipcutils.c

index 400f00cf66616869505f152205d1a34e8dc5c8be..c763cde696f02a914466eb0c965f08a5e0e70205 100644 (file)
@@ -99,6 +99,7 @@ int ipc_shm_get_info(int id, struct shm_data **shmds)
 {
        FILE *f;
        int i = 0, maxid;
+       char buf[BUFSIZ];
        struct shm_data *p;
        struct shmid_ds dummy;
 
@@ -111,8 +112,8 @@ int ipc_shm_get_info(int id, struct shm_data **shmds)
 
        while (fgetc(f) != '\n');               /* skip header */
 
-       while (feof(f) == 0) {
-               if (fscanf(f,
+       while (fgets(buf, sizeof(buf), f) != NULL) {
+               if (sscanf(buf,
                          "%d %d  %o %"SCNu64 " %u %u  "
                          "%"SCNu64 " %u %u %u %u %"SCNi64 " %"SCNi64 " %"SCNi64
                          " %"SCNu64 " %"SCNu64 "\n",
@@ -132,7 +133,7 @@ int ipc_shm_get_info(int id, struct shm_data **shmds)
                           &p->shm_ctim,
                           &p->shm_rss,
                           &p->shm_swp) != 16)
-                       continue;
+                       continue; /* ivalid line, skipped */
 
                if (id > -1) {
                        /* ID specified */