----- Original Message ----- > From: "Jan Stancek" <jstan...@redhat.com> > To: "Cyril Hrubis" <chru...@suse.cz> > Cc: ltp-list@lists.sourceforge.net, "Chuck Ebbert" <cebbert.l...@gmail.com> > Sent: Tuesday, 3 February, 2015 11:00:04 AM > Subject: Re: [LTP] proposed patch to fix sendmsg01 invalid flags set w/ > control ; returned -1 (expected -1), errno 22 > (expected 95) > > > > > > ----- Original Message ----- > > From: "Cyril Hrubis" <chru...@suse.cz> > > To: "snehalphule" <sne...@linux.vnet.ibm.com> > > Cc: ltp-list@lists.sourceforge.net, "Chuck Ebbert" <cebbert.l...@gmail.com> > > Sent: Tuesday, 3 February, 2015 10:37:52 AM > > Subject: Re: [LTP] proposed patch to fix sendmsg01 invalid flags set w/ > > control ; returned -1 (expected -1), errno 22 > > (expected 95) > > > > Hi! > > > *Description:* > > > For bug: https://bugs.launchpad.net/linaro-qa/+bug/1327251 > > > Purpose of Change: Because of code changes in socket.c file for > > > 32bit-userspace, return value changed to EINVAL in case of > > > 32bit-userspace/64-bit-kernelspace. > > > Test changed to check if 32user/64kernel , then return value should be > > > checked to EINVAL , > > > for other systems return value should be EOPNOTSUPP > > > > > > Kernel : 3.10.0-123.13.2 > > > Signed-off-by: snehalphule <sne...@linux.vnet.ibm.com> > > > > I can see this exact failure when I compile the testsuite with -m32 on > > 64bit hardware as well. But the patch below is wrong on several levels. > > > > My guess is that the root of the problem is similar to the problem fixed > > in: > > > > commit 1153a8438fe45530eb480d902271476c2e330663 > > Author: Chuck Ebbert <cebbert.l...@gmail.com> > > Date: Wed Oct 1 17:10:32 2014 -0500 > > > > recvfrom01: fix test for invalid message flags > > Agreed. We have seen in past, that this (.flags = ~MSG_CMSG_COMPAT) > leads to undefined behavior.
It appears the difference comes from LTP: https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/syscalls/utils/msg_common.h The flags has 0 value when compiled with -m32, so we never make it pass this check: if (flags & MSG_CMSG_COMPAT) return -EINVAL; but the kernel definition is rather based on config option: #if defined(CONFIG_COMPAT) #define MSG_CMSG_COMPAT 0x80000000 /* This message needs 32 bit fixups */ #else #define MSG_CMSG_COMPAT 0 /* We never have 32 bit fixups */ #endif sendmsg01 seems to be the only place where this flag is used. Regards, Jan > > > > > > > The test passes ~MSG_CMSG_COMPAT as flags and expect to hit particular > > safety > > check. The difference may be that the order of checks is different for > > compat > > syscalls, but that is just a guess. This would need more investigation to > > figure out what is wrong. > > I'm now trying to find that check. But even then, I'd still prefer to > remove that case. > > Regards, > Jan > > > > > > --- ltp-full-20140828/testcases/kernel/syscalls/sendmsg/sendmsg01.c.orig > > > 2015-01-23 00:54:22.804582530 -0600 > > > +++ ltp-full-20140828/testcases/kernel/syscalls/sendmsg/sendmsg01.c > > > 2015-01-23 00:57:26.149032808 -0600 > > > @@ -677,6 +677,38 @@ static void setup4(void) > > > control->cmsg_type = SCM_RIGHTS; > > > *(int *)CMSG_DATA(control) = tfd; > > > controllen = control->cmsg_len; > > > + > > > + // In case of Compact (32bit) user space and 64bit kernel > > > space, return value is EINVAL > > > + if (tdat[testno].flags == (unsigned)~MSG_CMSG_COMPAT) > > > + { > > > + char user_space_bit[BUFSIZ]; > > > + char kernel_arch[BUFSIZ]; > > > + int kernel_space_bit; > > > + > > > + FILE *pipe = popen("getconf LONG_BIT", "r"); > > > + if (fgets(user_space_bit, BUFSIZ, pipe) != NULL) > > > + { > > > + pipe = popen("arch", "r"); > > > + if (fgets(kernel_arch, BUFSIZ, pipe) != NULL) > > > + { > > > + // Remove carriage return from the buffer > > > + size_t len = strlen(user_space_bit); > > > + if (len > 0 && user_space_bit[len-1] == '\n') { > > > user_space_bit[--len] = '\0';} > > > + len = strlen(kernel_arch); > > > + if (len > 0 && kernel_arch[len-1] == '\n') { > > > kernel_arch[--len] = '\0';} > > > + > > > + // Check if Kernel used is 64 bit or 32 bit > > > + if (!strcmp(kernel_arch, "ppc64") || > > > !strcmp(kernel_arch, "s390x") || !strcmp(kernel_arch, "x86_64")) > > > + kernel_space_bit = 64; > > > + else > > > + kernel_space_bit = 32; > > > + > > > + // Only if it is Compact user space (32bit), then > > > return value is EINVAL > > > + if (atoi(user_space_bit) == 32 && kernel_space_bit > > > == 64) > > > + tdat[testno].experrno = EINVAL; > > > + } > > > + } > > > + } > > > } > > > > > > static void cleanup4(void) > > > > > > > > > > > > > > ------------------------------------------------------------------------------ > > > Dive into the World of Parallel Programming. The Go Parallel Website, > > > sponsored by Intel and developed in partnership with Slashdot Media, is > > > your > > > hub for all things parallel software development, from weekly thought > > > leadership blogs to news, videos, case studies, tutorials and more. Take > > > a > > > look and join the conversation now. http://goparallel.sourceforge.net/ > > > > > _______________________________________________ > > > Ltp-list mailing list > > > Ltp-list@lists.sourceforge.net > > > https://lists.sourceforge.net/lists/listinfo/ltp-list > > > > > > -- > > Cyril Hrubis > > chru...@suse.cz > > > > ------------------------------------------------------------------------------ > > Dive into the World of Parallel Programming. The Go Parallel Website, > > sponsored by Intel and developed in partnership with Slashdot Media, is > > your > > hub for all things parallel software development, from weekly thought > > leadership blogs to news, videos, case studies, tutorials and more. Take a > > look and join the conversation now. http://goparallel.sourceforge.net/ > > _______________________________________________ > > Ltp-list mailing list > > Ltp-list@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/ltp-list > > > > ------------------------------------------------------------------------------ > Dive into the World of Parallel Programming. The Go Parallel Website, > sponsored by Intel and developed in partnership with Slashdot Media, is your > hub for all things parallel software development, from weekly thought > leadership blogs to news, videos, case studies, tutorials and more. Take a > look and join the conversation now. http://goparallel.sourceforge.net/ > _______________________________________________ > Ltp-list mailing list > Ltp-list@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/ltp-list > ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list