]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
PR56052: resolve problems with expired sessions
authorEric Covener <covener@apache.org>
Sun, 1 Mar 2020 22:39:11 +0000 (22:39 +0000)
committerEric Covener <covener@apache.org>
Sun, 1 Mar 2020 22:39:11 +0000 (22:39 +0000)
session_load providers cache the session_rec pointer, so hollow
them out and reuse them instead of replacing them.

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

CHANGES
modules/session/mod_session.c

diff --git a/CHANGES b/CHANGES
index 09f1ecd7ef2ab187798089144dbea6b62b5f6d9f..63bdafeed250d67853a5712fd2dd09dee063b734 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.1
 
+  *) mod_session: Fix an issue that blocked new sessions being created after
+     session expiration or other session errors. PR56052 [Eric Covener]
+
   *) mod_proxy_hcheck: Allow healthcheck expressions to use %{Content-Type}.
      PR64140. [Renier Velazco <renier.velazco upr.edu>]
 
index b72ab140c6e73490caaf9c419aff9ed79412809d..8a7c385a5abad1cf4fa0bf99d03f9ea192f15d47 100644 (file)
@@ -137,23 +137,22 @@ static apr_status_t ap_session_load(request_rec * r, session_rec ** z)
             ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01817)
                     "error while decoding the session, "
                     "session not loaded: %s", r->uri);
-            zz = NULL;
+            /* preserve pointers to zz in load/save providers */
+            memset(zz, 0, sizeof(session_rec));
+            zz->pool = r->pool;
+            zz->entries = apr_table_make(zz->pool, 10);
         }
 
        /* invalidate session if session is expired */
         if (zz && zz->expiry && zz->expiry < now) {
             ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, "session is expired");
-            zz = NULL;
+            /* preserve pointers to zz in load/save providers */
+            memset(zz, 0, sizeof(session_rec));
+            zz->pool = r->pool;
+            zz->entries = apr_table_make(zz->pool, 10);
         }
     }
 
-    /* no luck, create a blank session */
-    if (!zz) {
-        zz = (session_rec *) apr_pcalloc(r->pool, sizeof(session_rec));
-        zz->pool = r->pool;
-        zz->entries = apr_table_make(zz->pool, 10);
-    }
-
     /* make sure the expiry and maxage are set, if present */
     if (dconf->maxage) {
         if (!zz->expiry) {