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
<snehal@linux.vnet.ibm.com>
---
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)