]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Don't close the dbm until after we have copied the datum retrieved by the fetch
authorBill Stoddard <stoddard@apache.org>
Wed, 7 Nov 2001 14:09:36 +0000 (14:09 +0000)
committerBill Stoddard <stoddard@apache.org>
Wed, 7 Nov 2001 14:09:36 +0000 (14:09 +0000)
into a local buffer.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk/modules/ssl@91781 13f79535-47bb-0310-9956-ffa450edef68

ssl_scache_dbm.c

index 62186c6e02bf9f9d09d9ab3b93bc9c87da9d9c37..f6275dbc3beec32a37aa6c6b116af80320db96c9 100644 (file)
@@ -218,34 +218,39 @@ SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *s, UCHAR *id, int idlen)
     dbmkey.dptr  = (char *)id;
     dbmkey.dsize = idlen;
 
-    /* and fetch it from the DBM file */
-    ssl_mutex_on(s);
+    /* and fetch it from the DBM file 
+     * XXX: Should we open the dbm against r->pool so the cleanup will
+     * do the apr_dbm_close? This would make the code a bit cleaner.
+     */
     if (apr_dbm_open(&dbm, mc->szSessionCacheDataFile,
            APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool) != APR_SUCCESS) {
         ssl_log(s, SSL_LOG_ERROR|SSL_ADD_ERRNO,
                 "Cannot open SSLSessionCache DBM file `%s' for reading (fetch)",
                 mc->szSessionCacheDataFile);
-        ssl_mutex_off(s);
         return NULL;
     }
     rc = apr_dbm_fetch(dbm, dbmkey, &dbmval);
-    apr_dbm_close(dbm);
-    ssl_mutex_off(s);
-
-    /* immediately return if not found */
-    if (rc != APR_SUCCESS)
+    if (rc != APR_SUCCESS) {
+        apr_dbm_close(dbm);
         return NULL;
-    if (dbmval.dptr == NULL || dbmval.dsize <= sizeof(time_t))
+    }
+    if (dbmval.dptr == NULL || dbmval.dsize <= sizeof(time_t)) {
+        apr_dbm_close(dbm);
         return NULL;
+    }
 
     /* parse resulting data */
     nData = dbmval.dsize-sizeof(time_t);
     ucpData = (UCHAR *)malloc(nData);
-    if (ucpData == NULL) 
+    if (ucpData == NULL) {
+        apr_dbm_close(dbm);
         return NULL;
+    }
     memcpy(ucpData, (char *)dbmval.dptr+sizeof(time_t), nData);
     memcpy(&expiry, dbmval.dptr, sizeof(time_t));
 
+    apr_dbm_close(dbm);
+
     /* make sure the stuff is still not expired */
     now = time(NULL);
     if (expiry <= now) {