@@ -553,10 +553,10 @@ PS_CLOSE_FUNC(redis)
553553}
554554/* }}} */
555555
556- static char *
557- redis_session_key (redis_pool_member * rpm , const char * key , int key_len , int * session_len ) {
558-
559- char * session ;
556+ static zend_string *
557+ redis_session_key (redis_pool_member * rpm , const char * key , int key_len )
558+ {
559+ zend_string * session ;
560560 char default_prefix [] = "PHPREDIS_SESSION:" ;
561561 char * prefix = default_prefix ;
562562 size_t prefix_len = sizeof (default_prefix )- 1 ;
@@ -567,10 +567,9 @@ redis_session_key(redis_pool_member *rpm, const char *key, int key_len, int *ses
567567 }
568568
569569 /* build session key */
570- * session_len = key_len + prefix_len ;
571- session = emalloc (* session_len );
572- memcpy (session , prefix , prefix_len );
573- memcpy (session + prefix_len , key , key_len );
570+ session = zend_string_alloc (key_len + prefix_len , 0 );
571+ memcpy (ZSTR_VAL (session ), prefix , prefix_len );
572+ memcpy (ZSTR_VAL (session ) + prefix_len , key , key_len );
574573
575574 return session ;
576575}
@@ -613,17 +612,19 @@ PS_CREATE_SID_FUNC(redis)
613612#endif
614613 }
615614
616- int resp_len ;
617615#if (PHP_MAJOR_VERSION < 7 )
618- pool -> lock_status . session_key = redis_session_key (rpm , sid , strlen (sid ), & resp_len );
616+ zend_string * session = redis_session_key (rpm , sid , strlen (sid ));
619617#else
620- pool -> lock_status . session_key = redis_session_key (rpm , ZSTR_VAL (sid ), ZSTR_LEN (sid ), & resp_len );
618+ zend_string * session = redis_session_key (rpm , ZSTR_VAL (sid ), ZSTR_LEN (sid ));
621619#endif
620+ pool -> lock_status .session_key = estrndup (ZSTR_VAL (session ), ZSTR_LEN (session ));
621+ zend_string_release (session );
622622
623623 if (lock_acquire (redis_sock , & pool -> lock_status TSRMLS_CC ) == SUCCESS ) {
624624 return sid ;
625625 }
626626
627+ efree (pool -> lock_status .session_key );
627628#if (PHP_MAJOR_VERSION < 7 )
628629 efree (sid );
629630#else
@@ -663,10 +664,10 @@ PS_READ_FUNC(redis)
663664 }
664665
665666 /* send GET command */
666- resp = redis_session_key (rpm , skey , skeylen , & resp_len );
667- pool -> lock_status .session_key = estrndup (resp , resp_len );
668- cmd_len = REDIS_SPPRINTF (& cmd , "GET" , "s " , resp , resp_len );
669- efree ( resp );
667+ zend_string * session = redis_session_key (rpm , skey , skeylen );
668+ pool -> lock_status .session_key = estrndup (ZSTR_VAL ( session ), ZSTR_LEN ( session ) );
669+ cmd_len = REDIS_SPPRINTF (& cmd , "GET" , "S " , session );
670+ zend_string_release ( session );
670671
671672 if (lock_acquire (redis_sock , & pool -> lock_status TSRMLS_CC ) != SUCCESS ) {
672673 php_error_docref (NULL TSRMLS_CC , E_NOTICE ,
@@ -710,8 +711,8 @@ PS_READ_FUNC(redis)
710711 */
711712PS_WRITE_FUNC (redis )
712713{
713- char * cmd , * response , * session ;
714- int cmd_len , response_len , session_len ;
714+ char * cmd , * response ;
715+ int cmd_len , response_len ;
715716#if (PHP_MAJOR_VERSION < 7 )
716717 const char * skey = key , * sval = val ;
717718 size_t skeylen = strlen (key ), svallen = vallen ;
@@ -730,23 +731,22 @@ PS_WRITE_FUNC(redis)
730731 }
731732
732733 /* send SET command */
733- session = redis_session_key (rpm , skey , skeylen , & session_len );
734+ zend_string * session = redis_session_key (rpm , skey , skeylen );
734735#if (PHP_MAJOR_VERSION < 7 )
735736 /* We need to check for PHP5 if the session key changes (a bug with session_regenerate_id() is causing a missing PS_CREATE_SID call)*/
736- int session_key_changed = strlen (pool -> lock_status .session_key ) != session_len || strncmp (pool -> lock_status .session_key , session , session_len ) != 0 ;
737+ int session_key_changed = strlen (pool -> lock_status .session_key ) != ZSTR_LEN ( session ) || strncmp (pool -> lock_status .session_key , ZSTR_VAL ( session ), ZSTR_LEN ( session ) ) != 0 ;
737738 if (session_key_changed ) {
738739 efree (pool -> lock_status .session_key );
739- pool -> lock_status .session_key = estrndup (session , session_len );
740+ pool -> lock_status .session_key = estrndup (ZSTR_VAL ( session ), ZSTR_LEN ( session ) );
740741 }
741742
742743 if (session_key_changed && lock_acquire (redis_sock , & pool -> lock_status TSRMLS_CC ) != SUCCESS ) {
743- efree (session );
744+ zend_string_release (session );
744745 return FAILURE ;
745746 }
746747#endif
747- cmd_len = REDIS_SPPRINTF (& cmd , "SETEX" , "sds" , session , session_len ,
748- INI_INT ("session.gc_maxlifetime" ), sval , svallen );
749- efree (session );
748+ cmd_len = REDIS_SPPRINTF (& cmd , "SETEX" , "Sds" , session , INI_INT ("session.gc_maxlifetime" ), sval , svallen );
749+ zend_string_release (session );
750750
751751 if (!write_allowed (redis_sock , & pool -> lock_status TSRMLS_CC ) || redis_sock_write (redis_sock , cmd , cmd_len TSRMLS_CC ) < 0 ) {
752752 efree (cmd );
@@ -773,8 +773,8 @@ PS_WRITE_FUNC(redis)
773773 */
774774PS_DESTROY_FUNC (redis )
775775{
776- char * cmd , * response , * session ;
777- int cmd_len , response_len , session_len ;
776+ char * cmd , * response ;
777+ int cmd_len , response_len ;
778778#if (PHP_MAJOR_VERSION < 7 )
779779 const char * skey = key ;
780780 size_t skeylen = strlen (key );
@@ -785,8 +785,8 @@ PS_DESTROY_FUNC(redis)
785785
786786 redis_pool * pool = PS_GET_MOD_DATA ();
787787 redis_pool_member * rpm = redis_pool_get_sock (pool , skey TSRMLS_CC );
788- RedisSock * redis_sock = rpm ? rpm -> redis_sock : NULL ;
789- if (!rpm || ! redis_sock ){
788+ RedisSock * redis_sock = rpm ? rpm -> redis_sock : NULL ;
789+ if (!redis_sock ) {
790790 return FAILURE ;
791791 }
792792
@@ -796,9 +796,9 @@ PS_DESTROY_FUNC(redis)
796796 }
797797
798798 /* send DEL command */
799- session = redis_session_key (rpm , skey , skeylen , & session_len );
800- cmd_len = REDIS_SPPRINTF (& cmd , "DEL" , "s " , session , session_len );
801- efree (session );
799+ zend_string * session = redis_session_key (rpm , skey , skeylen );
800+ cmd_len = REDIS_SPPRINTF (& cmd , "DEL" , "S " , session );
801+ zend_string_release (session );
802802 if (redis_sock_write (redis_sock , cmd , cmd_len TSRMLS_CC ) < 0 ) {
803803 efree (cmd );
804804 return FAILURE ;
0 commit comments