diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-09-24 13:25:35 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-09-24 13:25:35 +0400 |
commit | 599d462dfa2b6e149948f6c00cef5d1d84d809c7 (patch) | |
tree | 77ad13844c4a93c6948d3d0f789f1f28befff693 /winsup/cygwin/posix_ipc.cc | |
parent | 1c23aff7a306854a2f280f7ef2bbebdfca7b83b3 (diff) |
* posix_ipc.cc (mq_open): Avoid closing the same descriptor twice in
case of errors.
(sem_open): Ditto.
Diffstat (limited to 'winsup/cygwin/posix_ipc.cc')
-rw-r--r-- | winsup/cygwin/posix_ipc.cc | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc index 1c149cfbc..07881be05 100644 --- a/winsup/cygwin/posix_ipc.cc +++ b/winsup/cygwin/posix_ipc.cc @@ -312,7 +312,7 @@ extern "C" void *mmap64 (void *, size_t, int, int, int, _off64_t); extern "C" mqd_t mq_open (const char *name, int oflag, ...) { - int i, fd, nonblock, created; + int i, fd = -1, nonblock, created; long msgsize, index; _off64_t filesize = 0; va_list ap; @@ -449,6 +449,7 @@ exists: if (errno == ENOENT && (oflag & O_CREAT)) { close (fd); + fd = -1; goto again; } goto err; @@ -469,6 +470,7 @@ exists: if (mptr == (int8_t *) MAP_FAILED) goto err; close (fd); + fd = -1; /* Allocate one mq_info{} for each open */ if (!(mqinfo = (struct mq_info *) malloc (sizeof (struct mq_info)))) @@ -500,7 +502,8 @@ err: munmap((void *) mptr, (size_t) filesize); if (mqinfo) free (mqinfo); - close (fd); + if (fd >= 0) + close (fd); return (mqd_t) -1; } @@ -909,7 +912,7 @@ struct sem_finfo extern "C" sem_t * sem_open (const char *name, int oflag, ...) { - int i, fd, created; + int i, fd = -1, created; va_list ap; mode_t mode = 0; unsigned int value = 0; @@ -985,6 +988,7 @@ exists: if (errno == ENOENT && (oflag & O_CREAT)) { close (fd); + fd = -1; goto again; } goto err; @@ -1023,7 +1027,8 @@ err: unlink (semname); if (sem != SEM_FAILED) semaphore::close (sem); - close (fd); + if (fd >= 0) + close (fd); return SEM_FAILED; } |