From 8559192944d4a19d75b1e3d77d230d269dff7654 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 9 Jul 2014 13:59:16 +0100 Subject: [PATCH] fix order of file close and kqueue de-registration Thanks to memcheck. Merge to v6.1. --- racket/src/racket/src/port.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/racket/src/racket/src/port.c b/racket/src/racket/src/port.c index 346710acc5..5d86f08a50 100644 --- a/racket/src/racket/src/port.c +++ b/racket/src/racket/src/port.c @@ -6292,6 +6292,13 @@ int scheme_fd_regular_file(intptr_t fd, int or_other) ok = fstat(fd, &buf); } while ((ok == -1) && (errno == EINTR)); + if (ok == -1) { + scheme_log(NULL, SCHEME_LOG_ERROR, 0, + "error while checking whether a file descriptor is a regular file: %d", + errno); + return 0; + } + if (S_ISREG(buf.st_mode)) return 1; @@ -6967,13 +6974,13 @@ fd_close_input(Scheme_Input_Port *port) rc = adj_refcount(fip->refcount, -1); if (!rc) { int cr; + (void)scheme_fd_to_semaphore(fip->fd, MZFD_REMOVE, 0); do { cr = close(fip->fd); } while ((cr == -1) && (errno == EINTR)); # ifdef USE_FCNTL_AND_FORK_FOR_FILE_LOCKS release_lockf(fip->fd); # endif - (void)scheme_fd_to_semaphore(fip->fd, MZFD_REMOVE, 0); } } #endif @@ -8287,13 +8294,13 @@ fd_close_output(Scheme_Output_Port *port) if (!rc) { int cr; + (void)scheme_fd_to_semaphore(fop->fd, MZFD_REMOVE, 0); do { cr = close(fop->fd); } while ((cr == -1) && (errno == EINTR)); # ifdef USE_FCNTL_AND_FORK_FOR_FILE_LOCKS release_lockf(fop->fd); # endif - (void)scheme_fd_to_semaphore(fop->fd, MZFD_REMOVE, 0); } } #endif