From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexey Kodanev Date: Wed, 7 Apr 2021 20:28:58 +0300 Subject: [LTP] [PATCH 2/3] tst_safe_sysv_ipc.c: Fix wrong ret_check In-Reply-To: <1616497037-19158-2-git-send-email-xuyang2018.jy@cn.fujitsu.com> References: <1616497037-19158-1-git-send-email-xuyang2018.jy@cn.fujitsu.com> <1616497037-19158-2-git-send-email-xuyang2018.jy@cn.fujitsu.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ltp@lists.linux.it On 23.03.2021 13:57, Yang Xu wrote: > From: Yang Xu > > Since commit e9e508aad1("lib/tst_safe_sysv_ipc.c: add other cmds in ret_check"), > we added these cmds(SHM_LOCK, SHM_UNLOCK,SETALL,SETVAL) commands into this check. > > It is wrong because these flags are defined in different system headers, the same value > can represent different meaning in differnent headers. ie. SHM_LOCK is 11, GETPID is > also 11. SHM_LOCK only returns 0 and -1 but GETPID returns -1 and postive num. ret_check will > idenity it fail even we call semctl with GETPID successfully. > > Fix this regression by using different ret check for msg/shm/sem. > > Fixes: e9e508aad1("lib/tst_safe_sysv_ipc.c: add other cmds in ret_check") > Signed-off-by: Yang Xu > --- > lib/tst_safe_sysv_ipc.c | 52 ++++++++++++++++++++++++++++++----------- > 1 file changed, 39 insertions(+), 13 deletions(-) > > diff --git a/lib/tst_safe_sysv_ipc.c b/lib/tst_safe_sysv_ipc.c > index 012f5ba38..7a3c515e6 100644 > --- a/lib/tst_safe_sysv_ipc.c > +++ b/lib/tst_safe_sysv_ipc.c > @@ -13,28 +13,54 @@ > #include "lapi/sem.h" > > /* > - * The IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK, SETALL and SETVAL > - * can return either 0 or -1. > - * > - * Linux specific cmds either returns -1 on failure or positive integer > - * either index into an kernel array or shared primitive indentifier. > + * The IPC_STAT, IPC_SET, IPC_RMID can return either 0 or -1. > */ > -static int ret_check(int cmd, int ret) > +static int msg_ret_check(int cmd, int ret) > { > switch (cmd) { > case IPC_STAT: > case IPC_SET: > case IPC_RMID: > - case SHM_LOCK: > - case SHM_UNLOCK: > - case SETALL: > - case SETVAL: > return ret != 0; > default: > return ret < 0; > } > } > > +/* > + * The IPC_STAT, IPC_SET, IPC_RMID, SHM_LOCK, SHM_UNLOCK can return either 0 or -1. > + */ > +static int shm_ret_check(int cmd, int ret) > +{ > + switch (cmd) { > + case IPC_STAT: > + case IPC_SET: > + case IPC_RMID: > + case SHM_LOCK: > + case SHM_UNLOCK: > + return ret != 0; > + default: > + return ret < 0; > + } > +} > + > +/* > + * The IPC_STAT, IPC_SET, IPC_RMID, SETALL, SETVAL can return either 0 or -1. > + */ > +static int sem_ret_check(int cmd, int ret) > +{ > + switch (cmd) { > + case IPC_STAT: > + case IPC_SET: > + case IPC_RMID: > + case SETALL: > + case SETVAL: > + return ret != 0; > + default: > + return ret < 0; > + } > +} > + > int safe_msgget(const char *file, const int lineno, key_t key, int msgflg) > { > int rval; > @@ -103,7 +129,7 @@ int safe_msgctl(const char *file, const int lineno, int msqid, int cmd, > if (rval == -1) { > tst_brk_(file, lineno, TBROK | TERRNO, > "msgctl(%i, %i, %p) failed", msqid, cmd, buf); > - } else if (ret_check(cmd, rval)) { > + } else if (msg_ret_check(cmd, rval)) { > tst_brk_(file, lineno, TBROK | TERRNO, > "Invalid msgctl(%i, %i, %p) return value %d", msqid, > cmd, buf, rval); > @@ -173,7 +199,7 @@ int safe_shmctl(const char *file, const int lineno, int shmid, int cmd, > if (rval == -1) { > tst_brk_(file, lineno, TBROK | TERRNO, > "shmctl(%i, %i, %p) failed", shmid, cmd, buf); > - } else if (ret_check(cmd, rval)) { > + } else if (shm_ret_check(cmd, rval)) { > tst_brk_(file, lineno, TBROK | TERRNO, > "Invalid shmctl(%i, %i, %p) return value %d", shmid, > cmd, buf, rval); > @@ -219,7 +245,7 @@ int safe_semctl(const char *file, const int lineno, int semid, int semnum, > if (rval == -1) { > tst_brk_(file, lineno, TBROK | TERRNO, > "semctl(%i, %i, %i,...) failed", semid, semnum, cmd); > - } else if (ret_check(cmd, rval)) { > + } else if (sem_ret_check(cmd, rval)) { > tst_brk_(file, lineno, TBROK | TERRNO, > "Invalid semctl(%i, %i, %i,...) return value %d", semid, > semnum, cmd, rval); > Reviewed-by: Alexey Kodanev