@@ -121,6 +121,17 @@ redis_pool_free(redis_pool *pool) {
121121 efree (pool );
122122}
123123
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+
124135/* Send a command to Redis. Returns byte count written to socket (-1 on failure) */
125136static int redis_simple_cmd (RedisSock * redis_sock , char * cmd , int cmdlen ,
126137 char * * reply , int * replylen )
@@ -656,7 +667,7 @@ PS_UPDATE_TIMESTAMP_FUNC(redis)
656667
657668 /* send EXPIRE command */
658669 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 ( ));
660671 zend_string_release (session );
661672
662673 if (redis_sock_write (redis_sock , cmd , cmd_len ) < 0 ) {
@@ -753,7 +764,7 @@ PS_WRITE_FUNC(redis)
753764 /* send SET command */
754765 zend_string * session = redis_session_key (redis_sock , skey , skeylen );
755766
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 );
757768 zend_string_release (session );
758769
759770 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) {
10461057 /* Set up command and slot info */
10471058 skey = cluster_session_key (c , ZSTR_VAL (key ), ZSTR_LEN (key ), & skeylen , & slot );
10481059 cmdlen = redis_spprintf (NULL , NULL , & cmd , "SETEX" , "sds" , skey ,
1049- skeylen , INI_INT ( "session.gc_maxlifetime" ),
1060+ skeylen , session_gc_maxlifetime ( ),
10501061 ZSTR_VAL (val ), ZSTR_LEN (val ));
10511062 efree (skey );
10521063
0 commit comments