This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi Federico, On Nov 13 12:22, Federico Terraneo wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > closedir() calls _cleanupdir() on a pointer to DIR after a free(). > If HAVE_DD_LOCK is defined, it also dereferences the pointer when > calling __lock_release_recursive() and __lock_close_recursive(). > This was creating problems in my target. > > Moreover, the previous code would not deallocate the struct if > dirp->dd_fd is -1. > > Attached is a simple patch to fix the issue. Thanks! I think you found something very suspicious here. The test for fd != -1 is supposed to check... what? Opendir fails if open on the directory fails, so a valid DIR* also has a valid dd_fd value. The only time dd_fd can be -1 programatically is when closedir has been called and in this case DIR* is invalid, too. Or, if two threads call closedir for the same DIR* at about the same time, one of them could find that dd_fd is -1 and skip the close/free stuff. However, the code fd = dirp->dd_fd; if (fd != -1) { dirp->dd_fd = -1; is definitely not thread-safe, and closedir is not *supposed* to be reentrant or thread-safe. This test doesn't make sense. libc/sys/sparc64/closedir.c and libc/sys/sysvi386/closedir.c both don't perform it either. What I would suggest is to simplify the call to this code instead: int _DEFUN(closedir, (dirp), register DIR *dirp) { int fd, rc; #ifdef HAVE_DD_LOCK __lock_acquire_recursive(dirp->dd_lock); #endif fd = dirp->dd_fd; rc = close(fd); _cleanupdir(dirp); (void)free((void *)dirp->dd_buf); #ifdef HAVE_DD_LOCK __lock_release_recursive(dirp->dd_lock); __lock_close_recursive(dirp->dd_lock); #endif (void)free((void *)dirp); return rc; } Does that make sense? Did I miss something? Thanks, Corinna -- Corinna Vinschen Cygwin Maintainer Red Hat
Attachment:
pgppNAk4UiMXq.pgp
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |