]> granicus.if.org Git - apache/commitdiff
Fix a mutex problem in mod_ssl session cache support which
authorJeff Trawick <trawick@apache.org>
Tue, 1 Oct 2002 17:54:15 +0000 (17:54 +0000)
committerJeff Trawick <trawick@apache.org>
Tue, 1 Oct 2002 17:54:15 +0000 (17:54 +0000)
could lead to an infinite loop.

PR:                     12705
Diagnosis submitted by: amund.elstad@ergo.no (Amund Elstad)
Coded by:               Jeff Trawick

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

CHANGES
modules/ssl/ssl_scache_dbm.c

diff --git a/CHANGES b/CHANGES
index 1ce2ddc7607ba568609398343d2061e7f7e33a11..2c79799173f99b3d8718a6f1588014dd8e361006 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
 Changes with Apache 2.0.43
 
+  *) Fix a mutex problem in mod_ssl session cache support which
+     could lead to an infinite loop.  PR 12705  
+     [amund.elstad@ergo.no (Amund Elstad), Jeff Trawick]
+
   *) Allow POST requests and CGI scripts to work when DAV is enabled
      on the location.  [Ryan Bloom]
 
index 1b0054c3ad48d46302fe22ab2a16d747d59dc827..57a88ac15afab3a8c65176a323615674f067e7bd 100644 (file)
@@ -228,21 +228,25 @@ SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *s, UCHAR *id, int idlen)
      * 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.
      */
+    ssl_mutex_on(s);
     if ((rc = apr_dbm_open(&dbm, mc->szSessionCacheDataFile,
            APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) {
         ap_log_error(APLOG_MARK, APLOG_ERR, rc, s,
                      "Cannot open SSLSessionCache DBM file `%s' for reading "
                      "(fetch)",
                      mc->szSessionCacheDataFile);
+        ssl_mutex_off(s);
         return NULL;
     }
     rc = apr_dbm_fetch(dbm, dbmkey, &dbmval);
     if (rc != APR_SUCCESS) {
         apr_dbm_close(dbm);
+        ssl_mutex_off(s);
         return NULL;
     }
     if (dbmval.dptr == NULL || dbmval.dsize <= sizeof(time_t)) {
         apr_dbm_close(dbm);
+        ssl_mutex_off(s);
         return NULL;
     }
 
@@ -251,12 +255,14 @@ SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *s, UCHAR *id, int idlen)
     ucpData = (UCHAR *)malloc(nData);
     if (ucpData == NULL) {
         apr_dbm_close(dbm);
+        ssl_mutex_off(s);
         return NULL;
     }
     memcpy(ucpData, (char *)dbmval.dptr+sizeof(time_t), nData);
     memcpy(&expiry, dbmval.dptr, sizeof(time_t));
 
     apr_dbm_close(dbm);
+    ssl_mutex_off(s);
 
     /* make sure the stuff is still not expired */
     now = time(NULL);