The program is here. msgrcv08.c ----------- /* * Copyright (c) 2015 Author: Gabriellla Schmidt <g...@bruker.de> * Modify: Li Wang <liw...@redhat.com> * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it would be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * you should have received a copy of the GNU General Public License along * with this program; if not, write the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
/* * Description: * * A regression test for: * commit e7ca2552369c1dfe0216c626baf82c3d83ec36bb * Author: Mateusz Guzik <mgu...@redhat.com> * Date: Mon Jan 27 17:07:11 2014 -0800 * * ipc: fix compat msgrcv with negative msgtyp * * Reproduce: * * 32-bit application using the msgrcv() system call * gives the error message: * * msgrcv: No message of desired type * * If this progarm is compiled as 64-bit application it doesn't works. */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include "test.h" const char *TCID = "msgrcv08"; const int TST_TOTAL = 1; struct msgbuf { long mtype; /* message type, must be > 0 */ char mtext[16]; /* message data */ }; static void setup(void) { tst_require_root(NULL); TEST_PAUSE; } static void cleanup(void) { } static int msr(int msqid) { struct msgbuf msbs; struct msgbuf msbr; ssize_t sret; long mtype = 121; memset(&msbs, 0, sizeof(msbs)); msbs.mtype = mtype; if (msgsnd(msqid, &msbs, sizeof(msbs.mtext), IPC_NOWAIT)) tst_brkm(TBROK, NULL, "msgsnd error"); sret = msgrcv(msqid, &msbr, sizeof(msbr.mtext), -mtype, IPC_NOWAIT | MSG_NOERROR); if (sret < 0) { tst_resm(TFAIL, "Bug: No message of desired type."); return -1; } if (msbr.mtype != mtype) tst_brkm(TBROK, NULL, "found mtype %ld, expected %ld\n", msbr.mtype, mtype); if ((size_t)sret != sizeof(msbs.mtext)) tst_brkm(TBROK, NULL, "received %lu, expected %lu\n", (unsigned long)sret, (unsigned long)sizeof(msbs.mtext)); return 0; } static void msgrcv_test(void) { int ret; int msqid = msgget(IPC_PRIVATE, IPC_CREAT | IPC_EXCL | 0666); if (msqid < 0) tst_brkm(TBROK, NULL, "msgget error"); ret = msr(msqid); if (msgctl(msqid, IPC_RMID, 0)) tst_brkm(TBROK, NULL, "msgctl error"); if (!ret) tst_resm(TPASS, "Hi, no regression found!"); } int main(int argc, char *argv[]) { int lc; tst_parse_opts(argc, argv, NULL, NULL); setup(); for (lc = 0; TEST_LOOPING(lc); lc++) msgrcv_test(); cleanup(); tst_exit(); } -- Regards, Li Wang Email: liw...@redhat.com ----- Original Message ----- > Hi all, > > I am going to add a new testcase: > ltp/testcases/kernel/syscalls/ipc/msgrcv/msgrcv08.c > for regression test. > > But the key point is that this program 'msgrcv08.c' should be compiled into > 32-bit, > if it is compiled as 64-bit application it doesn't work. > > > So, I try to add one line in the .../ipc/msgrcv/Makefile: > > msgrcv08: CFLAGS+=-m32 > > and I get some compile errors like: > ----- > # make > make -C ../lib -f > "/mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150420/testcases/kernel/syscalls/ipc/msgrcv/../lib/Makefile" > all > make[1]: Entering directory > `/mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150420/testcases/kernel/syscalls/ipc/lib' > make[1]: Nothing to be done for `all'. > make[1]: Leaving directory > `/mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150420/testcases/kernel/syscalls/ipc/lib' > gcc -g -O2 -g -O2 -fno-strict-aliasing -pipe -Wall -W -g -O2 > -Wold-style-definition -m32 -D_FORTIFY_SOURCE=2 > -I/mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150420/testcases/kernel/include > -I/mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150420/testcases/kernel/syscalls/ipc/msgrcv/../lib > -I../../../../../include -I../../../../../include > -L/mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150420/testcases/kernel/syscalls/ipc/msgrcv/../lib > -L../../../../../lib msgrcv08.c -lltp -lipc -o msgrcv08 > /usr/bin/ld: skipping incompatible ../../../../../lib/libltp.a when searching > for -lltp > /usr/bin/ld: cannot find -lltp > /usr/bin/ld: skipping incompatible > /mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150420/testcases/kernel/syscalls/ipc/msgrcv/../lib/libipc.a > when searching for -lipc > /usr/bin/ld: cannot find -lipc > collect2: error: ld returned 1 exit status > make: *** [msgrcv08] Error 1 > ----- > > these because the libltp.a is 64-bit. > > > Then, I came up with a idea that I don't include the ltp-lib file in > 'msgrcv08.c', > and just add two lines in the .../ipc/msgrcv/Makefile: > > msgrcv08: > gcc -g -O2 -Wall -m32 msgrcv08.c -o msgrcv08 > > It works for me, but I know it's not appropriate for LTP management. > > What should I do? or, Is there any good way to solve this problem? > > Thanks~ > > -- > Regards, > Li Wang > Email: liw...@redhat.com > > > > ------------------------------------------------------------------------------ > _______________________________________________ > Ltp-list mailing list > Ltp-list@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/ltp-list > ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list