]> git.sur5r.net Git - openldap/commitdiff
ITS#7377 Errorcheck Windows calls and thread keys.
authorHallvard Furuseth <hallvard@openldap.org>
Mon, 15 Oct 2012 15:04:48 +0000 (17:04 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Mon, 15 Oct 2012 15:04:48 +0000 (17:04 +0200)
libraries/libmdb/mdb.c

index 383616116e46a86464bf80b97455634aca3f99dd..2ac92781131c100d41387c5d41165446cc1d4c44 100644 (file)
 #define pthread_mutex_t        HANDLE
 #define pthread_key_t  DWORD
 #define pthread_self() GetCurrentThreadId()
-#define pthread_key_create(x,y)        (*(x) = TlsAlloc())
+#define pthread_key_create(x,y)        \
+       ((*(x) = TlsAlloc()) == TLS_OUT_OF_INDEXES ? ErrCode() : 0)
 #define pthread_key_delete(x)  TlsFree(x)
 #define pthread_getspecific(x) TlsGetValue(x)
-#define pthread_setspecific(x,y)       TlsSetValue(x,y)
+#define pthread_setspecific(x,y)       (TlsSetValue(x,y) ? 0 : ErrCode())
 #define pthread_mutex_unlock(x)        ReleaseMutex(x)
 #define pthread_mutex_lock(x)  WaitForSingleObject(x, INFINITE)
 #define LOCK_MUTEX_R(env)      pthread_mutex_lock((env)->me_rmutex)
@@ -1636,6 +1637,7 @@ mdb_txn_renew0(MDB_txn *txn)
 {
        MDB_env *env = txn->mt_env;
        unsigned int i;
+       int rc;
 
        /* Setup db info */
        txn->mt_numdbs = env->me_numdbs;
@@ -1668,7 +1670,10 @@ mdb_txn_renew0(MDB_txn *txn)
                                env->me_numreaders = env->me_txns->mti_numreaders;
                                UNLOCK_MUTEX_R(env);
                                r = &env->me_txns->mti_readers[i];
-                               pthread_setspecific(env->me_txkey, r);
+                               if ((rc = pthread_setspecific(env->me_txkey, r)) != 0) {
+                                       env->me_txns->mti_readers[i].mr_pid = 0;
+                                       return rc;
+                               }
                        }
                        txn->mt_txnid = r->mr_txnid = env->me_txns->mti_txnid;
                        txn->mt_u.reader = r;
@@ -2771,9 +2776,12 @@ mdb_env_share_locks(MDB_env *env, int *excl)
                 * then release the existing exclusive lock.
                 */
                memset(&ov, 0, sizeof(ov));
-               LockFileEx(env->me_lfd, 0, 0, 1, 0, &ov);
-               UnlockFile(env->me_lfd, 0, 0, 1, 0);
-               *excl = 0;
+               if (!LockFileEx(env->me_lfd, 0, 0, 1, 0, &ov)) {
+                       rc = ErrCode();
+               } else {
+                       UnlockFile(env->me_lfd, 0, 0, 1, 0);
+                       *excl = 0;
+               }
        }
 #else
        {
@@ -3029,7 +3037,7 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
                        mdb_all_sa.lpSecurityDescriptor = &mdb_null_sd;
                        mdb_sec_inited = 1;
                }
-               GetFileInformationByHandle(env->me_lfd, &stbuf);
+               if (!GetFileInformationByHandle(env->me_lfd, &stbuf)) goto fail_errno;
                idbuf.volume = stbuf.dwVolumeSerialNumber;
                idbuf.nhigh  = stbuf.nFileIndexHigh;
                idbuf.nlow   = stbuf.nFileIndexLow;
@@ -3209,7 +3217,9 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mode_t mode)
                        }
                }
                DPRINTF("opened dbenv %p", (void *) env);
-               pthread_key_create(&env->me_txkey, mdb_env_reader_dest);
+               rc = pthread_key_create(&env->me_txkey, mdb_env_reader_dest);
+               if (rc)
+                       goto leave;
                env->me_numdbs = 2;     /* this notes that me_txkey was set */
 #ifdef _WIN32
                /* Windows TLS callbacks need help finding their TLS info. */