From 71fe98fdcec0a63e5ddd21dbf7a54e2155cf0af4 Mon Sep 17 00:00:00 2001 From: Jeff Trawick Date: Tue, 1 Oct 2002 17:54:15 +0000 Subject: [PATCH] Fix a mutex problem in mod_ssl session cache support which 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 | 4 ++++ modules/ssl/ssl_scache_dbm.c | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGES b/CHANGES index 1ce2ddc760..2c79799173 100644 --- 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] diff --git a/modules/ssl/ssl_scache_dbm.c b/modules/ssl/ssl_scache_dbm.c index 1b0054c3ad..57a88ac15a 100644 --- a/modules/ssl/ssl_scache_dbm.c +++ b/modules/ssl/ssl_scache_dbm.c @@ -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); -- 2.40.0