summaryrefslogtreecommitdiffstats
path: root/sys-utils/ipcutils.c
diff options
context:
space:
mode:
authorRuediger Meier2014-03-12 22:46:15 +0100
committerRuediger Meier2014-03-13 23:24:22 +0100
commitb507e426dff3759fe20c6a07cce388a739666c43 (patch)
tree73d042fe1eb365042ad7ced64b27ff1a5120eb87 /sys-utils/ipcutils.c
parentipcs: fix ipc_msg_get_info fallback case (diff)
downloadkernel-qcow2-util-linux-b507e426dff3759fe20c6a07cce388a739666c43.tar.gz
kernel-qcow2-util-linux-b507e426dff3759fe20c6a07cce388a739666c43.tar.xz
kernel-qcow2-util-linux-b507e426dff3759fe20c6a07cce388a739666c43.zip
ipcs: fix ipc_shm_get_info fallback case
"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>
Diffstat (limited to 'sys-utils/ipcutils.c')
-rw-r--r--sys-utils/ipcutils.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/sys-utils/ipcutils.c b/sys-utils/ipcutils.c
index 2491f7c91..d92cdf5a7 100644
--- a/sys-utils/ipcutils.c
+++ b/sys-utils/ipcutils.c
@@ -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;
}