diff --git a/ipc/util.c b/ipc/util.c index af1b572effb14432b9cfe02a8fbd66bbefdf4a59..53204b1d2e207b8d8700985a9dd5e0caf42e36b8 100644 --- a/ipc/util.c +++ b/ipc/util.c @@ -725,21 +725,14 @@ struct pid_namespace *ipc_seq_pid_ns(struct seq_file *s) static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos, loff_t *new_pos) { - struct kern_ipc_perm *ipc; - int total, id; - - total = 0; - for (id = 0; id < pos && total < ids->in_use; id++) { - ipc = idr_find(&ids->ipcs_idr, id); - if (ipc != NULL) - total++; - } - ipc = NULL; - if (total >= ids->in_use) + struct kern_ipc_perm *ipc = NULL; + int max_idx = ipc_get_maxidx(ids); + + if (max_idx == -1 || pos > max_idx) goto out; - for (; pos < IPCMNI; pos++) { + for (; pos <= max_idx; pos++) { ipc = idr_find(&ids->ipcs_idr, pos); if (ipc != NULL) { rcu_read_lock();