From: Bill Stoddard Date: Wed, 7 Nov 2001 14:09:36 +0000 (+0000) Subject: Don't close the dbm until after we have copied the datum retrieved by the fetch X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=348d06cf8656a8cc7387351f350c250bf2ee9275;p=thirdparty%2Fapache%2Fhttpd.git Don't close the dbm until after we have copied the datum retrieved by the fetch into a local buffer. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk/modules/ssl@91781 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/ssl_scache_dbm.c b/ssl_scache_dbm.c index 62186c6e02b..f6275dbc3be 100644 --- a/ssl_scache_dbm.c +++ b/ssl_scache_dbm.c @@ -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) {