]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
ipcs: fix ipc_shm_get_info fallback case
authorRuediger Meier <ruediger.meier@ga-group.nl>
Wed, 12 Mar 2014 21:46:15 +0000 (22:46 +0100)
committerRuediger Meier <ruediger.meier@ga-group.nl>
Thu, 13 Mar 2014 22:24:22 +0000 (23:24 +0100)
"ipcs -m -i n" (case id >= 0) was broken since v2.22-251-g61e14b4 if /sys
is not usable.

See also comments for commit "ipcs: fix ipc_msg_get_info fallback case".

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

index 2491f7c91ee7a06284091b3a09248d083a1f6a81..d92cdf5a78bd027f53f7ca072fe2b8fd728fd2c2 100644 (file)
@@ -154,27 +154,21 @@ int ipc_shm_get_info(int id, struct shm_data **shmds)
 
        /* Fallback; /proc or /sys file(s) missing. */
 shm_fallback:
-       i = id < 0 ? 0 : id;
-
        maxid = shmctl(0, SHM_INFO, (struct shmid_ds *) &dummy);
        if (maxid < 0)
                return 0;
 
-       while (i <= maxid) {
+       for (int j = 0; j <= maxid; j++) {
                int shmid;
                struct shmid_ds shmseg;
                struct ipc_perm *ipcp = &shmseg.shm_perm;
 
-               shmid = shmctl(i, SHM_STAT, &shmseg);
-               if (shmid < 0) {
-                       if (-1 < id) {
-                               free(*shmds);
-                               return 0;
-                       }
-                       i++;
+               shmid = shmctl(j, SHM_STAT, &shmseg);
+               if (shmid < 0 || (id > -1 && shmid != id)) {
                        continue;
                }
 
+               i++;
                p->shm_perm.key = ipcp->KEY;
                p->shm_perm.id = shmid;
                p->shm_perm.mode = ipcp->mode;
@@ -196,11 +190,12 @@ shm_fallback:
                        p->next = xcalloc(1, sizeof(struct shm_data));
                        p = p->next;
                        p->next = NULL;
-                       i++;
                } else
-                       return 1;
+                       break;
        }
 
+       if (i == 0)
+               free(*shmds);
        return i;
 }