diff options
author | dwmalone <dwmalone@FreeBSD.org> | 2003-02-08 09:26:31 +0000 |
---|---|---|
committer | dwmalone <dwmalone@FreeBSD.org> | 2003-02-08 09:26:31 +0000 |
commit | 7901f87059611b1f0e7666303597591dad9b5b16 (patch) | |
tree | 1fd11b8ecc779b7544d8981ddcf48b1f8131ad3e /sys/compat/linux/linux_socket.c | |
parent | ad4137525e8db67ebb61e6184ed706d38e73d6cb (diff) | |
download | FreeBSD-src-7901f87059611b1f0e7666303597591dad9b5b16.zip FreeBSD-src-7901f87059611b1f0e7666303597591dad9b5b16.tar.gz |
1) Linux_sendto was trashing the BSD sockaddr it put in the stackgap,
so be more careful about calling stackgap_init.
Tested by: Fred Souza <fred@storming.org>
2) Linux_sendmsg was forgetting to fill out the bsd_args struct.
Reviewed by: ume
3) The args to linux_connect have differently named types on alpha and
i386, so add a cast to stop gcc complaining.
Spotted by: peter
Diffstat (limited to 'sys/compat/linux/linux_socket.c')
-rw-r--r-- | sys/compat/linux/linux_socket.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index f283786..f3405e3 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -383,7 +383,7 @@ linux_sa_put(struct osockaddr *osa) /* Return 0 if IP_HDRINCL is set for the given socket. */ static int -linux_check_hdrincl(struct thread *td, int s) +linux_check_hdrincl(struct thread *td, caddr_t *sg, int s) { struct getsockopt_args /* { int s; @@ -393,13 +393,12 @@ linux_check_hdrincl(struct thread *td, int s) int *avalsize; } */ bsd_args; int error; - caddr_t sg, val, valsize; + caddr_t val, valsize; int size_val = sizeof val; int optval; - sg = stackgap_init(); - val = stackgap_alloc(&sg, sizeof(int)); - valsize = stackgap_alloc(&sg, sizeof(int)); + val = stackgap_alloc(sg, sizeof(int)); + valsize = stackgap_alloc(sg, sizeof(int)); if ((error = copyout(&size_val, valsize, sizeof(size_val)))) return (error); @@ -423,7 +422,7 @@ linux_check_hdrincl(struct thread *td, int s) * tweak endian-dependent fields in the IP packet. */ static int -linux_sendto_hdrincl(struct thread *td, struct sendto_args *bsd_args) +linux_sendto_hdrincl(struct thread *td, caddr_t *sg, struct sendto_args *bsd_args) { /* * linux_ip_copysize defines how many bytes we should copy @@ -433,7 +432,6 @@ linux_sendto_hdrincl(struct thread *td, struct sendto_args *bsd_args) */ #define linux_ip_copysize 8 - caddr_t sg; struct ip *packet; struct msghdr *msg; struct iovec *iov; @@ -455,10 +453,9 @@ linux_sendto_hdrincl(struct thread *td, struct sendto_args *bsd_args) * then use an iovec to glue it to the rest of the user packet * when calling sendmsg(). */ - sg = stackgap_init(); - packet = (struct ip *)stackgap_alloc(&sg, linux_ip_copysize); - msg = (struct msghdr *)stackgap_alloc(&sg, sizeof(*msg)); - iov = (struct iovec *)stackgap_alloc(&sg, sizeof(*iov)*2); + packet = (struct ip *)stackgap_alloc(sg, linux_ip_copysize); + msg = (struct msghdr *)stackgap_alloc(sg, sizeof(*msg)); + iov = (struct iovec *)stackgap_alloc(sg, sizeof(*iov)*2); /* Make a copy of the beginning of the packet to be sent */ if ((error = copyin(bsd_args->buf, packet, linux_ip_copysize))) @@ -626,7 +623,8 @@ linux_connect(struct thread *td, struct linux_connect_args *args) return (error); #endif /* __alpha__ */ - error = linux_getsockaddr(&sa, linux_args.name, linux_args.namelen); + error = linux_getsockaddr(&sa, (struct osockaddr *)linux_args.name, + linux_args.namelen); if (error) return (error); @@ -930,9 +928,9 @@ linux_sendto(struct thread *td, struct linux_sendto_args *args) bsd_args.to = (caddr_t) to; bsd_args.tolen = (unsigned int) tolen; - if (linux_check_hdrincl(td, linux_args.s) == 0) + if (linux_check_hdrincl(td, &sg, linux_args.s) == 0) /* IP_HDRINCL set, tweak the packet before sending */ - return (linux_sendto_hdrincl(td, &bsd_args)); + return (linux_sendto_hdrincl(td, &sg, &bsd_args)); return (sendto(td, &bsd_args)); } @@ -1053,6 +1051,9 @@ linux_sendmsg(struct thread *td, struct linux_sendmsg_args *args) return (error); } done: + bsd_args.s = linux_args.s; + bsd_args.msg = (caddr_t)nmsg; + bsd_args.flags = linux_args.flags; return (sendmsg(td, &bsd_args)); } |