Date: Sat, 8 Jul 2006 19:22:49 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 101046 for review Message-ID: <200607081922.k68JMndv068460@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=101046 Change 101046 by jhb@jhb_mutex on 2006/07/08 19:21:50 - Even though it's trivial, add a kern_close() and use it in various places instead of a struct close_args + close(). - Note a case in the svr4 streams gunk where we can leak the accept fd. - Add a kern_close() to accept() to close the fd if the copyout's fault. Affected files ... .. //depot/projects/smpng/sys/compat/linux/linux_socket.c#31 edit .. //depot/projects/smpng/sys/compat/svr4/svr4_stream.c#34 edit .. //depot/projects/smpng/sys/fs/portalfs/portal_vnops.c#23 edit .. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_other.c#9 edit .. //depot/projects/smpng/sys/kern/kern_descrip.c#93 edit .. //depot/projects/smpng/sys/kern/uipc_syscalls.c#86 edit .. //depot/projects/smpng/sys/sys/syscallsubr.h#45 edit Differences ... ==== //depot/projects/smpng/sys/compat/linux/linux_socket.c#31 (text+ko) ==== @@ -705,9 +705,6 @@ struct sockaddr * __restrict name; socklen_t * __restrict anamelen; } */ bsd_args; - struct close_args /* { - int fd; - } */ c_args; int error, fd; if ((error = copyin(args, &linux_args, sizeof(linux_args)))) @@ -724,8 +721,7 @@ if (linux_args.addr) { error = linux_sa_put(PTRIN(linux_args.addr)); if (error) { - c_args.fd = td->td_retval[0]; - (void)close(td, &c_args); + (void)kern_close(td, td->td_retval[0]); return (error); } } ==== //depot/projects/smpng/sys/compat/svr4/svr4_stream.c#34 (text+ko) ==== @@ -1035,7 +1035,6 @@ struct svr4_strm *st = svr4_stream_get(fp); struct svr4_strfdinsert fdi; struct dup2_args d2p; - struct close_args clp; if (st == NULL) { DPRINTF(("fdinsert: bad file type\n")); @@ -1061,9 +1060,7 @@ return error; } - clp.fd = st->s_afd; - - if ((error = close(td, &clp)) != 0) { + if ((error = kern_close(td, st->s_afd)) != 0) { DPRINTF(("fdinsert: close(%d) failed %d\n", st->s_afd, error)); return error; @@ -1919,6 +1916,7 @@ return EINVAL; } + /* XXX: We leak the accept fd if we get an error here. */ if (uap->ctl) { if (ctl.len > sizeof(sc)) ctl.len = sizeof(sc); ==== //depot/projects/smpng/sys/fs/portalfs/portal_vnops.c#23 (text+ko) ==== @@ -52,6 +52,7 @@ #include <sys/socket.h> #include <sys/socketvar.h> #include <sys/stat.h> +#include <sys/syscallsubr.h> #include <sys/sysproto.h> #include <sys/systm.h> #include <sys/un.h> @@ -77,10 +78,8 @@ int fd; { int error; - struct close_args ua; - ua.fd = fd; - error = close(td, &ua); + error = kern_close(td, fd); /* * We should never get an error, and there isn't anything * we could do if we got one, so just print a message. ==== //depot/projects/smpng/sys/i386/ibcs2/ibcs2_other.c#9 (text+ko) ==== @@ -109,9 +109,7 @@ error = kern_connect(td, fd, (struct sockaddr *)&sun); if (error) { - struct close_args cl; - cl.fd = fd; - close(td, &cl); + kern_close(td, fd); return error; } td->td_retval[0] = fd; ==== //depot/projects/smpng/sys/kern/kern_descrip.c#93 (text+ko) ==== @@ -973,12 +973,20 @@ struct thread *td; struct close_args *uap; { + + return (kern_close(td, uap->fd)); +} + +int +kern_close(td, fd) + struct thread *td; + int fd; +{ struct filedesc *fdp; struct file *fp; - int fd, error; + int error; int holdleaders; - fd = uap->fd; error = 0; holdleaders = 0; fdp = td->td_proc->p_fd; ==== //depot/projects/smpng/sys/kern/uipc_syscalls.c#86 (text+ko) ==== @@ -313,11 +313,12 @@ * return a namelen of zero for older code which might * ignore the return value from accept. */ - if (error && name == NULL) { + if (error) { (void) copyout(&namelen, uap->anamelen, sizeof(*uap->anamelen)); return (error); } + if (error == 0 && name != NULL) { #ifdef COMPAT_OLDSOCK if (compat) @@ -329,6 +330,8 @@ if (error == 0) error = copyout(&namelen, uap->anamelen, sizeof(namelen)); + if (error) + kern_close(td, td->td_retval[0]); free(name, M_SONAME); return (error); } ==== //depot/projects/smpng/sys/sys/syscallsubr.h#45 (text+ko) ==== @@ -70,6 +70,7 @@ struct timespec *ats); int kern_clock_settime(struct thread *td, clockid_t clock_id, struct timespec *ats); +int kern_close(struct thread *td, int fd); int kern_connect(struct thread *td, int fd, struct sockaddr *sa); int kern_eaccess(struct thread *td, char *path, enum uio_seg pathseg, int flags);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200607081922.k68JMndv068460>