Date: Wed, 23 Feb 2000 16:10:11 -0800 (PST) From: salaman@teknos.com To: freebsd-gnats-submit@FreeBSD.org Subject: i386/16946: ServerSockets are not working properly in Linux Emulation Message-ID: <200002240010.QAA37762@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 16946 >Category: i386 >Synopsis: ServerSockets are not working properly in Linux Emulation >Confidential: no >Severity: serious >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Feb 23 16:20:00 PST 2000 >Closed-Date: >Last-Modified: >Originator: Victor Salaman >Release: 4.0-Current 2/22/2000 >Organization: TEKNOS >Environment: FreeBSD centaur.teknos.com 4.0-CURRENT FreeBSD 4.0-CURRENT #30: Tue Feb 22 20:59:32 AST 2000 root@centaur.teknos.com:/usr/src/sys/compile/centaur i386 >Description: Applications such as daemons, servers, web servers which use server sockets do not work well. Especifically Web Servers do not work at all >How-To-Repeat: Install Linux JDK-1.2.2 RC4 Try to use any java web server program such as ApacheJServ, Resin, Tomcat and you'll see that server sockets die. >Fix: --- /usr/src/sys/i386/linux/linux_file.c Wed Feb 23 16:11:50 2000 +++ /usr/src/sys/i386/linux/linux_file.orig Wed Feb 23 16:11:37 2000 @@ -199,6 +199,12 @@ } */ fcntl_args; struct linux_flock linux_flock; struct flock *bsd_flock; + struct filedesc *fdp; + struct file *fp; + struct vnode *vp; + long pgid; + struct pgrp *pgrp; + struct tty *tp; caddr_t sg; dev_t dev; @@ -283,9 +289,47 @@ case LINUX_F_SETOWN: case LINUX_F_GETOWN: - fcntl_args.cmd = args->cmd == LINUX_F_SETOWN ? F_SETOWN : F_GETOWN; - fcntl_args.arg = args->arg; - return fcntl(p, &fcntl_args); + /* + * We need to route around the normal fcntl() for these calls, + * since it uses TIOC{G,S}PGRP, which is too restrictive for + * Linux F_{G,S}ETOWN semantics. For sockets, this problem + * does not exist. + */ + fdp = p->p_fd; + if ((u_int)args->fd >= fdp->fd_nfiles || + (fp = fdp->fd_ofiles[args->fd]) == NULL) + return EBADF; + if (fp->f_type == DTYPE_SOCKET) { + fcntl_args.cmd = args->cmd == LINUX_F_SETOWN ? F_SETOWN : F_GETOWN; + fcntl_args.arg = args->arg; + return fcntl(p, &fcntl_args); + } + vp = (struct vnode *)fp->f_data; + dev = vn_todev(vp); + if (dev == NODEV) + return EINVAL; + if (!(devsw(dev)->d_flags & D_TTY)) + return EINVAL; + tp = dev->si_tty; + if (!tp) + return EINVAL; + if (args->cmd == LINUX_F_GETOWN) { + p->p_retval[0] = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID; + return 0; + } + if ((long)args->arg <= 0) { + pgid = -(long)args->arg; + } else { + struct proc *p1 = pfind((long)args->arg); + if (p1 == 0) + return (ESRCH); + pgid = (long)p1->p_pgrp->pg_id; + } + pgrp = pgfind(pgid); + if (pgrp == NULL || pgrp->pg_session != p->p_session) + return EPERM; + tp->t_pgrp = pgrp; + return 0; } return EINVAL; } --- /usr/src/sys/i386/linux/linux_socket.c Wed Feb 23 16:11:50 2000 +++ /usr/src/sys/i386/linux/linux_socket.orig Wed Feb 23 16:11:48 2000 @@ -441,11 +441,6 @@ caddr_t name; int *anamelen; } */ bsd_args; - struct fcntl_args /* { - int fd; - int cmd; - long arg; - } */ f_args; int error; if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) @@ -453,24 +448,7 @@ bsd_args.s = linux_args.s; bsd_args.name = (caddr_t)linux_args.addr; bsd_args.anamelen = linux_args.namelen; - - if (error = oaccept(p, &bsd_args)) - return error; - /* - * linux appears not to copy flags from the parent socket to the - * accepted one, so we must clear the flags in the new descriptor. - */ - f_args.fd = p->p_retval[0]; - f_args.cmd = F_SETFL; - f_args.arg = 0; - /* - * we ignore errors here since otherwise we would have an open file - * descriptor that wasn't returned to the user. - */ - (void) fcntl(p, &f_args); - /* put the file descriptor back as the return value */ - p->p_retval[0] = f_args.fd; - return 0; + return oaccept(p, &bsd_args); } struct linux_getsockname_args { >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200002240010.QAA37762>