From: Howard Chu Date: Tue, 13 Aug 2013 18:34:32 +0000 (-0700) Subject: ITS#7664 delete lockfile if there is no environment X-Git-Tag: OPENLDAP_REL_ENG_2_4_36~2^2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=8725838409512e999d78ea7b60773ce2f94d588f;p=openldap ITS#7664 delete lockfile if there is no environment --- diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 6460173591..ae66ff41b0 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -163,6 +163,7 @@ #define GET_PAGESIZE(x) {SYSTEM_INFO si; GetSystemInfo(&si); (x) = si.dwPageSize;} #define close(fd) (CloseHandle(fd) ? 0 : -1) #define munmap(ptr,len) UnmapViewOfFile(ptr) +#define unlink(file) DeleteFile(file) #ifdef PROCESS_QUERY_LIMITED_INFORMATION #define MDB_PROCESS_QUERY_LIMITED_INFORMATION PROCESS_QUERY_LIMITED_INFORMATION #else @@ -3851,7 +3852,7 @@ fail: int mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode) { - int oflags, rc, len, excl = -1; + int oflags, rc, len, excl = -1, rmlock = 0; char *lpath, *dpath; if (env->me_fd!=INVALID_HANDLE_VALUE || (flags & ~(CHANGEABLE|CHANGELESS))) @@ -3903,6 +3904,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode goto leave; #ifdef _WIN32 +#define MDB_NO_SUCH_FILE ERROR_FILE_NOT_FOUND if (F_ISSET(flags, MDB_RDONLY)) { oflags = GENERIC_READ; len = OPEN_EXISTING; @@ -3914,6 +3916,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode env->me_fd = CreateFile(dpath, oflags, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, len, mode, NULL); #else +#define MDB_NO_SUCH_FILE ENOENT if (F_ISSET(flags, MDB_RDONLY)) oflags = O_RDONLY; else @@ -3923,6 +3926,8 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode #endif if (env->me_fd == INVALID_HANDLE_VALUE) { rc = ErrCode(); + if (F_ISSET(flags, MDB_RDONLY) && rc == MDB_NO_SUCH_FILE) + rmlock = 1; goto leave; } @@ -3954,6 +3959,8 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode leave: if (rc) { mdb_env_close0(env, excl); + if (rmlock && excl) + unlink(lpath); } free(lpath); return rc;