On Sat, 29 Nov 2003, Alfred Perlstein wrote: > * Daniel Eischen <eischen_at_vigrid.com> [031122 20:46] wrote: > > On Sat, 22 Nov 2003, Alfred Perlstein wrote: > > > > > This should make things work properly for apps that are linked > > > against libc_r and use filedescriptor passing. > > > > > > Can someone review and approve it please? > > > > This isn't needed. Any time a file descriptor is used, a call > > should first be made to _FD_LOCK() which ends up calling > > _thread_fd_lock() which then calls _thread_fd_table_init() > > for the file descriptor. > > > > If there's a reason that this is necessary, then I think it > > is just covering up another problem. I think I made this > > same comment a couple of years ago ;-) > > Sorry for the long delay here, I was in Vegas for my sister's > birthday. > > Actually there is a problem here. :( > > Descriptor's passed can't be closed because the uthread kernel does this: > > int > _close(int fd) > { > int flags; > int ret; > struct stat sb; > struct fd_table_entry *entry; > > if ((fd < 0) || (fd >= _thread_dtablesize) || > (fd == _thread_kern_pipe[0]) || (fd == _thread_kern_pipe[1]) || > (_thread_fd_table[fd] == NULL)) { > /* > * Don't allow silly programs to close the kernel pipe > * and non-active descriptors. > */ > errno = EBADF; > ret = -1; > } > ... > > So basically, if the entry is not initialized we can't close descriptors. > > What do you suggest we do? Just close the file: if ((fd < 0) || (fd >= _thread_dtablesize) || (fd == _thread_kern_pipe[0]) || (fd == _thread_kern_pipe[1])) { /* * Don't allow silly programs to close the kernel pipe * and non-active descriptors. */ errno = EBADF; ret = -1; } else if (_thread_fd_table[fd] == NULL) ret = __sys_close(fd); else { ... } -- Dan EischenReceived on Sat Nov 29 2003 - 13:57:50 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:31 UTC