NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
lib/53103: linux emulation of sendto(2) broken (testcase included)
>Number: 53103
>Category: lib
>Synopsis: linux emulation of sendto(2) broken (testcase included)
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: lib-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri Mar 16 15:40:00 +0000 2018
>Originator: Timo Buhrmester
>Release: 8.0_BETA
>Organization:
>Environment:
NetBSD kiwi.pr0.tips 8.0_BETA NetBSD 8.0_BETA (KIWIKERN) #0: Fri Mar 16 01:29:50 CET 2018 build%kiwi.pr0.tips@localhost:/stor/netbsd/obj/sys/arch/amd64/compile/KIWIKERN amd64
>Description:
linux-emulated sendto(2) fails with EFAULT in a situation where the native sendto(2) succeeds.
Ultimate failure is in 'copyin', got there via
sockargs via
do_sys_sendmsg_so via
do_sys_sendmsg from
linux_sys_sendto
Testcase below
>How-To-Repeat:
The below program takes two arguments, an IP address and a port number, and sends a UDP datagram containing "hello world\n" to said address/port using sendto(2)
Compile it on a 64bit Linux machine (Debian 9 in my case)
and try to run it under NetBSD's Linux emulation, sendto(2) will fail.
Compile on NetBSD and run natively, it succeeds.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MSG "hello world\n"
int
main(int argc, char **argv)
{
if (argc != 3) {
fprintf(stderr, "Usage: %s <ip4addr> <port>\n", argv[0]);
exit(1);
}
struct sockaddr_storage ss;
struct sockaddr_in *sa = (struct sockaddr_in *)&ss;
struct in_addr ia;
int r = inet_pton(AF_INET, argv[1], &ia);
if (r != 1) {
perror("inet_pton");
exit(1);
}
sa->sin_family = AF_INET;
sa->sin_addr = ia;
sa->sin_port = htons(atoi(argv[2]));
int s = socket(AF_INET, SOCK_DGRAM, 0);
ssize_t st = sendto(s, MSG, strlen(MSG), 0, (struct sockaddr *)sa, sizeof *sa);
fprintf(stderr, "sendto: returned %zd, expected %zu\n", st, strlen(MSG));
}
>Fix:
Home |
Main Index |
Thread Index |
Old Index