Skip to content

Commit 07c16e5

Browse files
committed
Apply zend_string API for redis_session_key
1 parent 5f75efc commit 07c16e5

File tree

2 files changed

+43
-35
lines changed

2 files changed

+43
-35
lines changed

common.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,24 @@ typedef struct {
2525
#define ZSTR_VAL(s) (s)->val
2626
#define ZSTR_LEN(s) (s)->len
2727

28+
static zend_always_inline zend_string *
29+
zend_string_alloc(size_t len, int persistent)
30+
{
31+
zend_string *zstr = emalloc(sizeof(*zstr) + len + 1);
32+
33+
ZSTR_VAL(zstr) = (char *)zstr + sizeof(*zstr);
34+
zstr->len = len;
35+
zstr->gc = 0x01;
36+
return zstr;
37+
}
38+
2839
static zend_always_inline zend_string *
2940
zend_string_init(const char *str, size_t len, int persistent)
3041
{
31-
zend_string *zstr = emalloc(sizeof(zend_string) + len + 1);
42+
zend_string *zstr = zend_string_alloc(len, persistent);
3243

33-
ZSTR_VAL(zstr) = (char *)zstr + sizeof(zend_string);
3444
memcpy(ZSTR_VAL(zstr), str, len);
3545
ZSTR_VAL(zstr)[len] = '\0';
36-
zstr->len = len;
37-
zstr->gc = 0x01;
3846
return zstr;
3947
}
4048

redis_session.c

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
711712
PS_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
*/
774774
PS_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

Comments
 (0)