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