diff options
author | Ruediger Meier | 2014-03-13 09:07:44 +0100 |
---|---|---|
committer | Ruediger Meier | 2014-03-14 00:22:56 +0100 |
commit | 5078a0d31d17d95abef980ab719ffc5e5a7ba863 (patch) | |
tree | 0a4c709f0001b9a2dccad1547029d105ae8b64e1 /sys-utils/ipcutils.c | |
parent | ipcs: fix ipc_shm_get_info fallback case (diff) | |
download | kernel-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.c | 18 |
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; } |