1eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang/* 2eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * Copyright (c) 2015 Author: Gabriellla Schmidt <gsc@bruker.de> 3eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * Modify: Li Wang <liwang@redhat.com> 4eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 5eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * This program is free software; you can redistribute it and/or modify it 6eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * under the terms of version 2 of the GNU General Public License as 7eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * published by the Free Software Foundation. 8eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 9eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * This program is distributed in the hope that it would be useful, but 10eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * WITHOUT ANY WARRANTY; without even the implied warranty of 11eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 13eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * you should have received a copy of the GNU General Public License along 14eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * with this program; if not, write the Free Software Foundation, Inc., 15eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 16eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang */ 17eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 18eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang/* 19eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * Description: 20eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 21eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * A regression test for: 22eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * commit e7ca2552369c1dfe0216c626baf82c3d83ec36bb 23eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * Author: Mateusz Guzik <mguzik@redhat.com> 24eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * Date: Mon Jan 27 17:07:11 2014 -0800 25eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 26eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * ipc: fix compat msgrcv with negative msgtyp 27eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 28eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * Reproduce: 29eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 30eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 32-bit application using the msgrcv() system call 31eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * gives the error message: 32eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 33eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * msgrcv: No message of desired type 34eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * 35eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang * If this progarm is compiled as 64-bit application it works. 36eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang */ 37eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 38eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#include <stdio.h> 39eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#include <string.h> 40eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#include <unistd.h> 41eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#include <sys/types.h> 42eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#include <sys/ipc.h> 43eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#include <sys/msg.h> 44eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#include "test.h" 45eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 46eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wangconst char *TCID = "msgrcv08"; 47eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wangconst int TST_TOTAL = 1; 48eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 49eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#if __WORDSIZE == 32 50eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 51eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wangstruct msgbuf { 52eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang long mtype; /* message type, must be > 0 */ 53eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang char mtext[16]; /* message data */ 54eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang}; 55eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 56eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wangstatic void msr(int msqid) 57eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang{ 58eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang struct msgbuf msbs; 59eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang struct msgbuf msbr; 60eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang ssize_t sret; 61eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang long mtype = 121; 62eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 63eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang memset(&msbs, 0, sizeof(msbs)); 64eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang msbs.mtype = mtype; 65eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 66eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang if (msgsnd(msqid, &msbs, sizeof(msbs.mtext), IPC_NOWAIT)) 67eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_brkm(TBROK | TERRNO, NULL, "msgsnd error"); 68eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 69eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang sret = msgrcv(msqid, &msbr, sizeof(msbr.mtext), -mtype, IPC_NOWAIT | MSG_NOERROR); 70eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 71eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang if (sret < 0) { 72eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_resm(TFAIL, "Bug: No message of desired type."); 73eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang return; 74eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang } 75eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 76eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang if (msbr.mtype != mtype) 77eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_brkm(TBROK, NULL, 78eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang "found mtype %ld, expected %ld\n", msbr.mtype, mtype); 79eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 80eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang if ((size_t)sret != sizeof(msbs.mtext)) 81eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_brkm(TBROK, NULL, "received %zi, expected %zu\n", 82eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang sret, sizeof(msbs.mtext)); 83eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 84eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_resm(TPASS, "No regression found."); 85eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang} 86eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 87eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wangstatic void msgrcv_test(void) 88eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang{ 89eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang int msqid = msgget(IPC_PRIVATE, IPC_CREAT | IPC_EXCL | 0666); 90eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 91eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang if (msqid < 0) 92eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_brkm(TBROK | TERRNO, NULL, "msgget error"); 93eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 94eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang msr(msqid); 95eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 96eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang if (msgctl(msqid, IPC_RMID, 0)) 97eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_brkm(TBROK | TERRNO, NULL, "msgctl error"); 98eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang} 99eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 100eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wangint main(int argc, char *argv[]) 101eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang{ 102eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang int lc; 103eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 104eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_parse_opts(argc, argv, NULL, NULL); 105eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 106eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang for (lc = 0; TEST_LOOPING(lc); lc++) 107eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang msgrcv_test(); 108eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 109eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_exit(); 110eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang} 111eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang 112eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#else /* no 64-bit */ 113eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wangint main(void) 114eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang{ 115eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang tst_brkm(TCONF, NULL, "not works when compiled as 64-bit application."); 116eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang} 117eccd238da7cf886d0c92dc2f4deedf3a27127566Li Wang#endif 118