diff options
| author | jvoisin | 2018-12-15 14:30:32 +0000 |
|---|---|---|
| committer | GitHub | 2018-12-15 14:30:32 +0000 |
| commit | 0988660cc2f5d194468f81fab48160c0f9b253dc (patch) | |
| tree | 3fd9cbae8641abc34e56d476f2eaa39b679c9e46 /src/sp_session.c | |
| parent | 244f3da227d07b94602a3b517fcb8aefeb9f459d (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.c | 15 |
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); |
