summaryrefslogtreecommitdiff
path: root/modules/session
diff options
context:
space:
mode:
authorGraham Leggett <minfrin@apache.org>2011-12-02 17:51:27 +0000
committerGraham Leggett <minfrin@apache.org>2011-12-02 17:51:27 +0000
commit731e0d2dd4352f2329200788077f3ff266cc341c (patch)
tree029db72bee74ce542dd584930f1975c746e89cf2 /modules/session
parent04adeb4e59896d2ec21331006d9ddab661529ad5 (diff)
downloadhttpd-731e0d2dd4352f2329200788077f3ff266cc341c.tar.gz
Backport:
mod_session: Use apr_status_t as a return code across the mod_session API, clarify where we ignore errors and why. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1209606 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/session')
-rw-r--r--modules/session/mod_session.c49
-rw-r--r--modules/session/mod_session.h34
-rw-r--r--modules/session/mod_session_cookie.c4
-rw-r--r--modules/session/mod_session_crypto.c18
4 files changed, 61 insertions, 44 deletions
diff --git a/modules/session/mod_session.c b/modules/session/mod_session.c
index 72a99f4ae2..a56fcd3515 100644
--- a/modules/session/mod_session.c
+++ b/modules/session/mod_session.c
@@ -88,8 +88,7 @@ static int session_included(request_rec * r, session_dir_conf * conf)
* @param r The request
* @param z A pointer to where the session will be written.
*/
-/* ??? We return errors but we ignore them thru-out. ??? */
-static int ap_session_load(request_rec * r, session_rec ** z)
+static apr_status_t ap_session_load(request_rec * r, session_rec ** z)
{
session_dir_conf *dconf = ap_get_module_config(r->per_dir_config,
@@ -168,8 +167,7 @@ static int ap_session_load(request_rec * r, session_rec ** z)
* @param r The request
* @param z A pointer to where the session will be written.
*/
-/* ??? We return errors but we ignore them thru-out. ??? */
-static int ap_session_save(request_rec * r, session_rec * z)
+static apr_status_t ap_session_save(request_rec * r, session_rec * z)
{
if (z) {
apr_time_t now = apr_time_now();
@@ -239,14 +237,21 @@ static int ap_session_save(request_rec * r, session_rec * z)
* @param key The key to get.
* @param value The buffer to write the value to.
*/
-static void ap_session_get(request_rec * r, session_rec * z, const char *key, const char **value)
+static apr_status_t ap_session_get(request_rec * r, session_rec * z,
+ const char *key, const char **value)
{
if (!z) {
- ap_session_load(r, &z); /* errors ignored?? */
+ apr_status_t rv;
+ rv = ap_session_load(r, &z);
+ if (APR_SUCCESS != rv) {
+ return rv;
+ }
}
if (z && z->entries) {
*value = apr_table_get(z->entries, key);
}
+
+ return OK;
}
/**
@@ -261,11 +266,15 @@ static void ap_session_get(request_rec * r, session_rec * z, const char *key, co
* @param key The key to set. The existing key value will be replaced.
* @param value The value to set.
*/
-static void ap_session_set(request_rec * r, session_rec * z,
- const char *key, const char *value)
+static apr_status_t ap_session_set(request_rec * r, session_rec * z,
+ const char *key, const char *value)
{
if (!z) {
- ap_session_load(r, &z); /* errors ignored?? */
+ apr_status_t rv;
+ rv = ap_session_load(r, &z);
+ if (APR_SUCCESS != rv) {
+ return rv;
+ }
}
if (z) {
if (value) {
@@ -276,6 +285,7 @@ static void ap_session_set(request_rec * r, session_rec * z,
}
z->dirty = 1;
}
+ return APR_SUCCESS;
}
static int identity_count(int *count, const char *key, const char *val)
@@ -314,7 +324,7 @@ static int identity_concat(char *buffer, const char *key, const char *val)
* @param r The request pointer.
* @param z A pointer to where the session will be written.
*/
-static int session_identity_encode(request_rec * r, session_rec * z)
+static apr_status_t session_identity_encode(request_rec * r, session_rec * z)
{
char *buffer = NULL;
@@ -350,7 +360,7 @@ static int session_identity_encode(request_rec * r, session_rec * z)
* @param r The request pointer.
* @param z A pointer to where the session will be written.
*/
-static int session_identity_decode(request_rec * r, session_rec * z)
+static apr_status_t session_identity_decode(request_rec * r, session_rec * z)
{
char *last = NULL;
@@ -407,7 +417,7 @@ static int session_identity_decode(request_rec * r, session_rec * z)
* attempt to save the session will be called
*/
static apr_status_t session_output_filter(ap_filter_t * f,
- apr_bucket_brigade * in)
+ apr_bucket_brigade * in)
{
/* save all the sessions in all the requests */
@@ -421,7 +431,8 @@ static apr_status_t session_output_filter(ap_filter_t * f,
&session_module);
/* load the session, or create one if necessary */
- ap_session_load(r, &z); /* errors ignored?? */
+ /* when unset or on error, z will be NULL */
+ ap_session_load(r, &z);
if (!z || z->written) {
r = r->next;
continue;
@@ -440,7 +451,8 @@ static apr_status_t session_output_filter(ap_filter_t * f,
}
/* save away the session, and we're done */
- ap_session_save(r, z); /* errors ignored?? */
+ /* when unset or on error, we've complained to the log */
+ ap_session_save(r, z);
r = r->next;
}
@@ -478,9 +490,14 @@ static int session_fixups(request_rec * r)
&session_module);
session_rec *z = NULL;
- ap_session_load(r, &z); /* errors ignored?? */
- if (conf->env) {
+ /* if an error occurs or no session has been configured, we ignore
+ * the broken session and allow it to be recreated from scratch on save
+ * if necessary.
+ */
+ ap_session_load(r, &z);
+
+ if (z && conf->env) {
session_identity_encode(r, z);
if (z->encoded) {
apr_table_set(r->subprocess_env, HTTP_SESSION, z->encoded);
diff --git a/modules/session/mod_session.h b/modules/session/mod_session.h
index 647f8c59a2..a6dd5e9f47 100644
--- a/modules/session/mod_session.h
+++ b/modules/session/mod_session.h
@@ -125,8 +125,8 @@ typedef struct {
* @param r The request
* @param z A pointer to where the session will be written.
*/
-APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, int, session_load,
- (request_rec * r, session_rec ** z))
+APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, apr_status_t, session_load,
+ (request_rec * r, session_rec ** z))
/**
* Hook to save the session.
@@ -137,8 +137,8 @@ APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, int, session_load,
* @param r The request
* @param z A pointer to where the session will be written.
*/
-APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, int, session_save,
- (request_rec * r, session_rec * z))
+APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, apr_status_t, session_save,
+ (request_rec * r, session_rec * z))
/**
* Hook to encode the session.
@@ -150,8 +150,8 @@ APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, int, session_save,
* @param r The request
* @param z A pointer to where the session will be written.
*/
-APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, int, session_encode,
- (request_rec * r, session_rec * z))
+APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, apr_status_t, session_encode,
+ (request_rec * r, session_rec * z))
/**
* Hook to decode the session.
@@ -163,15 +163,19 @@ APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, int, session_encode,
* @param r The request
* @param z A pointer to where the session will be written.
*/
-APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, int, session_decode,
- (request_rec * r, session_rec * z))
-
-APR_DECLARE_OPTIONAL_FN(void, ap_session_get, (request_rec * r, session_rec * z,
- const char *key, const char **value));
-APR_DECLARE_OPTIONAL_FN(void, ap_session_set, (request_rec * r, session_rec * z,
- const char *key, const char *value));
-APR_DECLARE_OPTIONAL_FN(int, ap_session_load, (request_rec *, session_rec **));
-APR_DECLARE_OPTIONAL_FN(int, ap_session_save, (request_rec *, session_rec *));
+APR_DECLARE_EXTERNAL_HOOK(ap, SESSION, apr_status_t, session_decode,
+ (request_rec * r, session_rec * z))
+
+APR_DECLARE_OPTIONAL_FN(
+ apr_status_t,
+ ap_session_get,
+ (request_rec * r, session_rec * z, const char *key, const char **value));
+APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_session_set,
+ (request_rec * r, session_rec * z, const char *key, const char *value));
+APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_session_load,
+ (request_rec *, session_rec **));
+APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_session_save,
+ (request_rec *, session_rec *));
/**
* The name of the module.
diff --git a/modules/session/mod_session_cookie.c b/modules/session/mod_session_cookie.c
index 0100518fea..15b3d9c6c5 100644
--- a/modules/session/mod_session_cookie.c
+++ b/modules/session/mod_session_cookie.c
@@ -54,7 +54,7 @@ typedef struct {
* @param r The request pointer.
* @param z A pointer to where the session will be written.
*/
-static int session_cookie_save(request_rec * r, session_rec * z)
+static apr_status_t session_cookie_save(request_rec * r, session_rec * z)
{
session_cookie_dir_conf *conf = ap_get_module_config(r->per_dir_config,
@@ -109,7 +109,7 @@ static int session_cookie_save(request_rec * r, session_rec * z)
*
* On success, this returns APR_SUCCESS.
*/
-static int session_cookie_load(request_rec * r, session_rec ** z)
+static apr_status_t session_cookie_load(request_rec * r, session_rec ** z)
{
session_cookie_dir_conf *conf = ap_get_module_config(r->per_dir_config,
diff --git a/modules/session/mod_session_crypto.c b/modules/session/mod_session_crypto.c
index 06871d8ae9..6715402d30 100644
--- a/modules/session/mod_session_crypto.c
+++ b/modules/session/mod_session_crypto.c
@@ -57,11 +57,6 @@ typedef struct {
int library_set;
} session_crypto_conf;
-AP_DECLARE(int) ap_session_crypto_encode(request_rec * r, session_rec * z);
-AP_DECLARE(int) ap_session_crypto_decode(request_rec * r, session_rec * z);
-AP_DECLARE(int) ap_session_crypto_init(apr_pool_t *p, apr_pool_t *plog,
- apr_pool_t *ptemp, server_rec *s);
-
/**
* Initialise the encryption as per the current config.
*
@@ -344,7 +339,7 @@ static apr_status_t decrypt_string(request_rec * r, const apr_crypto_t *f,
* @param r The request pointer.
* @param z A pointer to where the session will be written.
*/
-AP_DECLARE(int) ap_session_crypto_encode(request_rec * r, session_rec * z)
+static apr_status_t session_crypto_encode(request_rec * r, session_rec * z)
{
char *encoded = NULL;
@@ -374,7 +369,8 @@ AP_DECLARE(int) ap_session_crypto_encode(request_rec * r, session_rec * z)
* @param r The request pointer.
* @param z A pointer to where the session will be written.
*/
-AP_DECLARE(int) ap_session_crypto_decode(request_rec * r, session_rec * z)
+static apr_status_t session_crypto_decode(request_rec * r,
+ session_rec * z)
{
char *encoded = NULL;
@@ -402,7 +398,7 @@ AP_DECLARE(int) ap_session_crypto_decode(request_rec * r, session_rec * z)
/**
* Initialise the SSL in the post_config hook.
*/
-AP_DECLARE(int) ap_session_crypto_init(apr_pool_t *p, apr_pool_t *plog,
+static int session_crypto_init(apr_pool_t *p, apr_pool_t *plog,
apr_pool_t *ptemp, server_rec *s)
{
const apr_crypto_driver_t *driver = NULL;
@@ -605,9 +601,9 @@ static const command_rec session_crypto_cmds[] =
static void register_hooks(apr_pool_t * p)
{
- ap_hook_session_encode(ap_session_crypto_encode, NULL, NULL, APR_HOOK_LAST);
- ap_hook_session_decode(ap_session_crypto_decode, NULL, NULL, APR_HOOK_FIRST);
- ap_hook_post_config(ap_session_crypto_init, NULL, NULL, APR_HOOK_LAST);
+ ap_hook_session_encode(session_crypto_encode, NULL, NULL, APR_HOOK_LAST);
+ ap_hook_session_decode(session_crypto_decode, NULL, NULL, APR_HOOK_FIRST);
+ ap_hook_post_config(session_crypto_init, NULL, NULL, APR_HOOK_LAST);
}
AP_DECLARE_MODULE(session_crypto) =