summaryrefslogtreecommitdiffstats
path: root/sys-utils/ipcutils.c
diff options
context:
space:
mode:
authorRuediger Meier2014-03-13 09:07:44 +0100
committerRuediger Meier2014-03-14 00:22:56 +0100
commit5078a0d31d17d95abef980ab719ffc5e5a7ba863 (patch)
tree0a4c709f0001b9a2dccad1547029d105ae8b64e1 /sys-utils/ipcutils.c
parentipcs: fix ipc_shm_get_info fallback case (diff)
downloadkernel-qcow2-util-linux-5078a0d31d17d95abef980ab719ffc5e5a7ba863.tar.gz
kernel-qcow2-util-linux-5078a0d31d17d95abef980ab719ffc5e5a7ba863.tar.xz
kernel-qcow2-util-linux-5078a0d31d17d95abef980ab719ffc5e5a7ba863.zip
ipcs: fix ipc_sem_get_info fallback case
"ipcs -s -i n" (case id >= 0) was broken since v2.22-254-g1e2418a 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.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/sys-utils/ipcutils.c b/sys-utils/ipcutils.c
index d92cdf5a7..ef856f5b7 100644
--- a/sys-utils/ipcutils.c
+++ b/sys-utils/ipcutils.c
@@ -295,29 +295,23 @@ int ipc_sem_get_info(int id, struct sem_data **semds)
/* Fallback; /proc or /sys file(s) missing. */
sem_fallback:
- i = id < 0 ? 0 : id;
-
arg.array = (ushort *) (void *)&dummy;
maxid = semctl(0, 0, SEM_INFO, arg);
if (maxid < 0)
return 0;
- while (i <= maxid) {
+ for (int j = 0; j <= maxid; j++) {
int semid;
struct semid_ds semseg;
struct ipc_perm *ipcp = &semseg.sem_perm;
arg.buf = (struct semid_ds *)&semseg;
- semid = semctl(i, 0, SEM_STAT, arg);
- if (semid < 0) {
- if (-1 < id) {
- free(*semds);
- return 0;
- }
- i++;
+ semid = semctl(j, 0, SEM_STAT, arg);
+ if (semid < 0 || (id > -1 && semid != id)) {
continue;
}
+ i++;
p->sem_perm.key = ipcp->KEY;
p->sem_perm.id = semid;
p->sem_perm.mode = ipcp->mode;
@@ -336,10 +330,12 @@ sem_fallback:
i++;
} else {
get_sem_elements(p);
- return 1;
+ break;
}
}
+ if (i == 0)
+ free(*semds);
return i;
}