From: Christophe Jaillet Date: Tue, 13 Nov 2012 21:03:10 +0000 (+0000) Subject: mod_session_dbd: fix a segmentation fault in the function dbd_remove. X-Git-Tag: 2.5.0-alpha~6124 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b40d4dc8808aa07af296ea76e64091b8b3046f88;p=thirdparty%2Fapache%2Fhttpd.git mod_session_dbd: fix a segmentation fault in the function dbd_remove. The segmentation fault is caused by an uninitialized function pointer session_dbd_acquire_fn. PR 53452 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1408958 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index a16b1c2904e..9581e052dd0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_session_dbd: fix a segmentation fault in the function dbd_remove. + PR 53452. [, Reimo Rebane] + *) core: New directive RegisterHttpMethod for registering non-standard HTTP methods. [Stefan Fritsch] diff --git a/modules/session/mod_session_dbd.c b/modules/session/mod_session_dbd.c index a1fbdc797bc..59575ed558f 100644 --- a/modules/session/mod_session_dbd.c +++ b/modules/session/mod_session_dbd.c @@ -333,18 +333,12 @@ static apr_status_t dbd_remove(request_rec * r, const char *key) { apr_status_t rv; + ap_dbd_t *dbd; apr_dbd_prepared_t *statement; int rows = 0; session_dbd_dir_conf *conf = ap_get_module_config(r->per_dir_config, &session_dbd_module); - ap_dbd_t *dbd = session_dbd_acquire_fn(r); - if (dbd == NULL) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01861) - "failed to acquire database connection to remove " - "session with key '%s'", key); - return APR_EGENERAL; - } if (conf->deletelabel == NULL) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01862) @@ -352,15 +346,13 @@ static apr_status_t dbd_remove(request_rec * r, const char *key) return APR_EGENERAL; } - statement = apr_hash_get(dbd->prepared, conf->deletelabel, - APR_HASH_KEY_STRING); - if (statement == NULL) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01863) - "prepared statement could not be found for " - "SessionDBDdeletelabel with the label '%s'", - conf->deletelabel); - return APR_EGENERAL; - } + rv = dbd_init(r, conf->deletelabel, &dbd, &statement); + if (rv != APR_SUCCESS) { + // No need to do additional error logging here, it has already + // been done in dbd_init if needed + return rv; + } + rv = apr_dbd_pvbquery(dbd->driver, r->pool, dbd->handle, &rows, statement, key, NULL); if (rv != APR_SUCCESS) {