@@ -121,6 +121,17 @@ redis_pool_free(redis_pool *pool) {
121
121
efree (pool );
122
122
}
123
123
124
+ /* Retreive session.gc_maxlifetime from php.ini protecting against an integer overflow */
125
+ static int session_gc_maxlifetime () {
126
+ zend_long value = INI_INT ("session.gc_maxlifetime" );
127
+ if (value > INT_MAX ) {
128
+ php_error_docref (NULL , E_NOTICE , "session.gc_maxlifetime overflows INT_MAX, truncating." );
129
+ return INT_MAX ;
130
+ }
131
+
132
+ return value ;
133
+ }
134
+
124
135
/* Send a command to Redis. Returns byte count written to socket (-1 on failure) */
125
136
static int redis_simple_cmd (RedisSock * redis_sock , char * cmd , int cmdlen ,
126
137
char * * reply , int * replylen )
@@ -656,7 +667,7 @@ PS_UPDATE_TIMESTAMP_FUNC(redis)
656
667
657
668
/* send EXPIRE command */
658
669
zend_string * session = redis_session_key (redis_sock , skey , skeylen );
659
- cmd_len = REDIS_SPPRINTF (& cmd , "EXPIRE" , "Sd" , session , INI_INT ( "session.gc_maxlifetime" ));
670
+ cmd_len = REDIS_SPPRINTF (& cmd , "EXPIRE" , "Sd" , session , session_gc_maxlifetime ( ));
660
671
zend_string_release (session );
661
672
662
673
if (redis_sock_write (redis_sock , cmd , cmd_len ) < 0 ) {
@@ -753,7 +764,7 @@ PS_WRITE_FUNC(redis)
753
764
/* send SET command */
754
765
zend_string * session = redis_session_key (redis_sock , skey , skeylen );
755
766
756
- cmd_len = REDIS_SPPRINTF (& cmd , "SETEX" , "Sds" , session , INI_INT ( "session.gc_maxlifetime" ), sval , svallen );
767
+ cmd_len = REDIS_SPPRINTF (& cmd , "SETEX" , "Sds" , session , session_gc_maxlifetime ( ), sval , svallen );
757
768
zend_string_release (session );
758
769
759
770
if (!write_allowed (redis_sock , & pool -> lock_status ) || redis_sock_write (redis_sock , cmd , cmd_len ) < 0 ) {
@@ -1046,7 +1057,7 @@ PS_WRITE_FUNC(rediscluster) {
1046
1057
/* Set up command and slot info */
1047
1058
skey = cluster_session_key (c , ZSTR_VAL (key ), ZSTR_LEN (key ), & skeylen , & slot );
1048
1059
cmdlen = redis_spprintf (NULL , NULL , & cmd , "SETEX" , "sds" , skey ,
1049
- skeylen , INI_INT ( "session.gc_maxlifetime" ),
1060
+ skeylen , session_gc_maxlifetime ( ),
1050
1061
ZSTR_VAL (val ), ZSTR_LEN (val ));
1051
1062
efree (skey );
1052
1063
0 commit comments