summaryrefslogtreecommitdiff
path: root/src/sp_session.c
diff options
context:
space:
mode:
authorjvoisin2018-12-15 14:30:32 +0000
committerGitHub2018-12-15 14:30:32 +0000
commit0988660cc2f5d194468f81fab48160c0f9b253dc (patch)
tree3fd9cbae8641abc34e56d476f2eaa39b679c9e46 /src/sp_session.c
parent244f3da227d07b94602a3b517fcb8aefeb9f459d (diff)
Improve simulation mode for session cookies (#259)
Since decrypt_zval doesn't provide a way to tell apart failed and successful decryption when used in simulation mode, we'll have to restore the original value if something goes wrong, because crypto_secretbox_open might modify the value.
Diffstat (limited to 'src/sp_session.c')
-rw-r--r--src/sp_session.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/sp_session.c b/src/sp_session.c
index 550b83d..b3db622 100644
--- a/src/sp_session.c
+++ b/src/sp_session.c
@@ -30,19 +30,18 @@ static int sp_hook_s_read(PS_READ_ARGS) {
30 const sp_config_session *config_session = 30 const sp_config_session *config_session =
31 SNUFFLEUPAGUS_G(config).config_session; 31 SNUFFLEUPAGUS_G(config).config_session;
32 32
33 if (r == SUCCESS && config_session->encrypt && val != NULL && *val != NULL && 33 if ((NULL == val) || (NULL == *val) || (0 == ZSTR_LEN(*val))) {
34 ZSTR_LEN(*val)) { 34 return r;
35 }
36
37 if (r == SUCCESS && config_session->encrypt) {
35 zend_string *orig_val = *val; 38 zend_string *orig_val = *val;
36 zval val_zval; 39 zval val_zval;
37 ZVAL_PSTRINGL(&val_zval, ZSTR_VAL(*val), ZSTR_LEN(*val)); 40 ZVAL_PSTRINGL(&val_zval, ZSTR_VAL(*val), ZSTR_LEN(*val));
38 41
39 int ret = decrypt_zval(&val_zval, config_session->simulation, NULL); 42 int ret = decrypt_zval(&val_zval, config_session->simulation, NULL);
40 if (0 != ret) { 43 if (ZEND_HASH_APPLY_KEEP != ret) {
41 if (config_session->simulation) { 44 zend_bailout();
42 return ret;
43 } else {
44 zend_bailout();
45 }
46 } 45 }
47 46
48 *val = zend_string_dup(val_zval.value.str, 0); 47 *val = zend_string_dup(val_zval.value.str, 0);