diff options
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/sem.c | 14 | ||||
-rw-r--r-- | ipc/shm.c | 8 |
2 files changed, 21 insertions, 1 deletions
diff --git a/ipc/sem.c b/ipc/sem.c index 899b598b63be..a7e40ed8a076 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -796,6 +796,13 @@ static int count_semncnt (struct sem_array * sma, ushort semnum) struct sem_queue * q; semncnt = 0; + list_for_each_entry(q, &sma->sem_base[semnum].sem_pending, list) { + struct sembuf * sops = q->sops; + BUG_ON(sops->sem_num != semnum); + if ((sops->sem_op < 0) && !(sops->sem_flg & IPC_NOWAIT)) + semncnt++; + } + list_for_each_entry(q, &sma->sem_pending, list) { struct sembuf * sops = q->sops; int nsops = q->nsops; @@ -815,6 +822,13 @@ static int count_semzcnt (struct sem_array * sma, ushort semnum) struct sem_queue * q; semzcnt = 0; + list_for_each_entry(q, &sma->sem_base[semnum].sem_pending, list) { + struct sembuf * sops = q->sops; + BUG_ON(sops->sem_num != semnum); + if ((sops->sem_op == 0) && !(sops->sem_flg & IPC_NOWAIT)) + semzcnt++; + } + list_for_each_entry(q, &sma->sem_pending, list) { struct sembuf * sops = q->sops; int nsops = q->nsops; diff --git a/ipc/shm.c b/ipc/shm.c index 34af1fe34701..7e199fa1960f 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -493,7 +493,13 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) if (shmflg & SHM_HUGETLB) { struct hstate *hs = hstate_sizelog((shmflg >> SHM_HUGE_SHIFT) & SHM_HUGE_MASK); - size_t hugesize = ALIGN(size, huge_page_size(hs)); + size_t hugesize; + + if (!hs) { + error = -EINVAL; + goto no_file; + } + hugesize = ALIGN(size, huge_page_size(hs)); /* hugetlb_file_setup applies strict accounting */ if (shmflg & SHM_NORESERVE) |