diff options
-rw-r--r-- | STATUS | 5 | ||||
-rw-r--r-- | shmem/unix/shm.c | 6 |
2 files changed, 6 insertions, 5 deletions
@@ -91,11 +91,6 @@ RELEASE SHOWSTOPPERS: CURRENT VOTES: - * shmem: Don't leak file descriptors - Trunk patch: http://svn.apache.org/viewvc?view=revision&revision=910597 - 1.5.x patch: trunk patch works - +1: jim - * Add object perms set macros and implement them for shm and mutex Trunk patch: http://svn.apache.org/viewvc?view=revision&revision=741862 http://svn.apache.org/viewvc?view=revision&revision=741869 diff --git a/shmem/unix/shm.c b/shmem/unix/shm.c index 80d56894f..73a729df9 100644 --- a/shmem/unix/shm.c +++ b/shmem/unix/shm.c @@ -314,26 +314,31 @@ APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, * exist before calling ftok(). */ shmkey = ftok(filename, 1); if (shmkey == (key_t)-1) { + apr_file_close(file); return errno; } if ((new_m->shmid = shmget(shmkey, new_m->realsize, SHM_R | SHM_W | IPC_CREAT | IPC_EXCL)) < 0) { + apr_file_close(file); return errno; } if ((new_m->base = shmat(new_m->shmid, NULL, 0)) == (void *)-1) { + apr_file_close(file); return errno; } new_m->usable = new_m->base; if (shmctl(new_m->shmid, IPC_STAT, &shmbuf) == -1) { + apr_file_close(file); return errno; } apr_uid_current(&uid, &gid, pool); shmbuf.shm_perm.uid = uid; shmbuf.shm_perm.gid = gid; if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) { + apr_file_close(file); return errno; } @@ -341,6 +346,7 @@ APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, status = apr_file_write(file, (const void *)&reqsize, &nbytes); if (status != APR_SUCCESS) { + apr_file_close(file); return status; } status = apr_file_close(file); |