@@ -390,7 +390,7 @@ static zend_result php_session_initialize(void) /* {{{ */
390
390
}
391
391
392
392
/* Open session handler first */
393
- if (PS (mod )-> s_open (& PS (mod_data ), PS (save_path ), PS (session_name )) == FAILURE
393
+ if (PS (mod )-> s_open (& PS (mod_data ), PS (save_path ), ZSTR_VAL ( PS (session_name ) )) == FAILURE
394
394
/* || PS(mod_data) == NULL */ /* FIXME: open must set valid PS(mod_data) with success */
395
395
) {
396
396
php_session_abort ();
@@ -664,24 +664,41 @@ static PHP_INI_MH(OnUpdateName) /* {{{ */
664
664
SESSION_CHECK_ACTIVE_STATE ;
665
665
SESSION_CHECK_OUTPUT_STATE ;
666
666
667
- /* Numeric session.name won't work at all */
668
- if ((!ZSTR_LEN (new_value ) || is_numeric_string (ZSTR_VAL (new_value ), ZSTR_LEN (new_value ), NULL , NULL , 0 ))) {
669
- int err_type ;
667
+ int err_type ;
670
668
671
- if (stage == ZEND_INI_STAGE_RUNTIME || stage == ZEND_INI_STAGE_ACTIVATE || stage == ZEND_INI_STAGE_STARTUP ) {
672
- err_type = E_WARNING ;
673
- } else {
674
- err_type = E_ERROR ;
675
- }
669
+ if (stage == ZEND_INI_STAGE_RUNTIME || stage == ZEND_INI_STAGE_ACTIVATE || stage == ZEND_INI_STAGE_STARTUP ) {
670
+ err_type = E_WARNING ;
671
+ } else {
672
+ err_type = E_ERROR ;
673
+ }
676
674
675
+ if (ZSTR_LEN (new_value ) == 0 ) {
676
+ /* Do not output error when restoring ini options. */
677
+ if (stage != ZEND_INI_STAGE_DEACTIVATE ) {
678
+ php_error_docref (NULL , err_type , "session.name \"%s\" cannot be empty" , ZSTR_VAL (new_value ));
679
+ }
680
+ return FAILURE ;
681
+ }
682
+ /* Nul bytes are not allowed */
683
+ if (ZSTR_LEN (new_value ) != strlen (ZSTR_VAL (new_value ))) {
684
+ /* Do not output error when restoring ini options. */
685
+ if (stage != ZEND_INI_STAGE_DEACTIVATE ) {
686
+ php_error_docref (NULL , err_type , "session.name \"%s\" cannot contain nul bytes" , ZSTR_VAL (new_value ));
687
+ }
688
+ return FAILURE ;
689
+ }
690
+ /* Numeric session.name won't work at all */
691
+ if (is_numeric_str_function (new_value , NULL , NULL )) {
677
692
/* Do not output error when restoring ini options. */
678
693
if (stage != ZEND_INI_STAGE_DEACTIVATE ) {
679
694
php_error_docref (NULL , err_type , "session.name \"%s\" cannot be numeric or empty" , ZSTR_VAL (new_value ));
680
695
}
681
696
return FAILURE ;
682
697
}
683
698
684
- return OnUpdateStringUnempty (entry , new_value , mh_arg1 , mh_arg2 , mh_arg3 , stage );
699
+ zend_string * * p = (zend_string * * ) ZEND_INI_GET_ADDR ();
700
+ * p = new_value ;
701
+ return SUCCESS ;
685
702
}
686
703
/* }}} */
687
704
@@ -1278,9 +1295,10 @@ static void php_session_remove_cookie(void) {
1278
1295
size_t session_cookie_len ;
1279
1296
size_t len = sizeof ("Set-Cookie" )- 1 ;
1280
1297
1281
- ZEND_ASSERT (strpbrk (PS (session_name ), "=,; \t\r\n\013\014" ) == NULL );
1282
- spprintf (& session_cookie , 0 , "Set-Cookie: %s=" , PS (session_name ));
1298
+ ZEND_ASSERT (strpbrk (ZSTR_VAL ( PS (session_name ) ), "=,; \t\r\n\013\014" ) == NULL );
1299
+ spprintf (& session_cookie , 0 , "Set-Cookie: %s=" , ZSTR_VAL ( PS (session_name ) ));
1283
1300
1301
+ // TODO Manually compute from known information?
1284
1302
session_cookie_len = strlen (session_cookie );
1285
1303
current = l -> head ;
1286
1304
while (current ) {
@@ -1325,8 +1343,9 @@ static zend_result php_session_send_cookie(void) /* {{{ */
1325
1343
return FAILURE ;
1326
1344
}
1327
1345
1346
+ // TODO need to Check for nul byte?
1328
1347
/* Prevent broken Set-Cookie header, because the session_name might be user supplied */
1329
- if (strpbrk (PS (session_name ), "=,; \t\r\n\013\014" ) != NULL ) { /* man isspace for \013 and \014 */
1348
+ if (strpbrk (ZSTR_VAL ( PS (session_name ) ), "=,; \t\r\n\013\014" ) != NULL ) { /* man isspace for \013 and \014 */
1330
1349
php_error_docref (NULL , E_WARNING , "session.name cannot contain any of the following '=,; \\t\\r\\n\\013\\014'" );
1331
1350
return FAILURE ;
1332
1351
}
@@ -1335,7 +1354,7 @@ static zend_result php_session_send_cookie(void) /* {{{ */
1335
1354
e_id = php_url_encode (ZSTR_VAL (PS (id )), ZSTR_LEN (PS (id )));
1336
1355
1337
1356
smart_str_appendl (& ncookie , "Set-Cookie: " , sizeof ("Set-Cookie: " )- 1 );
1338
- smart_str_appendl (& ncookie , PS (session_name ), strlen ( PS ( session_name ) ));
1357
+ smart_str_append (& ncookie , PS (session_name ));
1339
1358
smart_str_appendc (& ncookie , '=' );
1340
1359
smart_str_appendl (& ncookie , ZSTR_VAL (e_id ), ZSTR_LEN (e_id ));
1341
1360
@@ -1461,7 +1480,7 @@ PHPAPI zend_result php_session_reset_id(void) /* {{{ */
1461
1480
if (PS (define_sid )) {
1462
1481
smart_str var = {0 };
1463
1482
1464
- smart_str_appends (& var , PS (session_name ));
1483
+ smart_str_append (& var , PS (session_name ));
1465
1484
smart_str_appendc (& var , '=' );
1466
1485
smart_str_appends (& var , ZSTR_VAL (PS (id )));
1467
1486
smart_str_0 (& var );
@@ -1489,18 +1508,15 @@ PHPAPI zend_result php_session_reset_id(void) /* {{{ */
1489
1508
(data = zend_hash_str_find (& EG (symbol_table ), "_COOKIE" , sizeof ("_COOKIE" ) - 1 ))) {
1490
1509
ZVAL_DEREF (data );
1491
1510
if (Z_TYPE_P (data ) == IS_ARRAY &&
1492
- (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), strlen ( PS ( session_name ) )))) {
1511
+ (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1493
1512
ZVAL_DEREF (ppid );
1494
1513
apply_trans_sid = 0 ;
1495
1514
}
1496
1515
}
1497
1516
}
1498
1517
if (apply_trans_sid ) {
1499
- zend_string * sname ;
1500
- sname = zend_string_init (PS (session_name ), strlen (PS (session_name )), 0 );
1501
- php_url_scanner_reset_session_var (sname , 1 ); /* This may fail when session name has changed */
1502
- zend_string_release_ex (sname , 0 );
1503
- php_url_scanner_add_session_var (PS (session_name ), strlen (PS (session_name )), ZSTR_VAL (PS (id )), ZSTR_LEN (PS (id )), 1 );
1518
+ php_url_scanner_reset_session_var (PS (session_name ), 1 ); /* This may fail when session name has changed */
1519
+ php_url_scanner_add_session_var (ZSTR_VAL (PS (session_name )), ZSTR_LEN (PS (session_name )), ZSTR_VAL (PS (id )), ZSTR_LEN (PS (id )), 1 );
1504
1520
}
1505
1521
return SUCCESS ;
1506
1522
}
@@ -1512,7 +1528,6 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1512
1528
zval * ppid ;
1513
1529
zval * data ;
1514
1530
char * p , * value ;
1515
- size_t lensess ;
1516
1531
1517
1532
switch (PS (session_status )) {
1518
1533
case php_session_active :
@@ -1547,8 +1562,6 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1547
1562
PS (send_cookie ) = PS (use_cookies ) || PS (use_only_cookies );
1548
1563
}
1549
1564
1550
- lensess = strlen (PS (session_name ));
1551
-
1552
1565
/*
1553
1566
* Cookies are preferred, because initially cookie and get
1554
1567
* variables will be available.
@@ -1560,7 +1573,7 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1560
1573
if (!PS (id )) {
1561
1574
if (PS (use_cookies ) && (data = zend_hash_str_find (& EG (symbol_table ), "_COOKIE" , sizeof ("_COOKIE" ) - 1 ))) {
1562
1575
ZVAL_DEREF (data );
1563
- if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), lensess ))) {
1576
+ if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1564
1577
ppid2sid (ppid );
1565
1578
PS (send_cookie ) = 0 ;
1566
1579
PS (define_sid ) = 0 ;
@@ -1570,13 +1583,13 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1570
1583
if (!PS (use_only_cookies )) {
1571
1584
if (!PS (id ) && (data = zend_hash_str_find (& EG (symbol_table ), "_GET" , sizeof ("_GET" ) - 1 ))) {
1572
1585
ZVAL_DEREF (data );
1573
- if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), lensess ))) {
1586
+ if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1574
1587
ppid2sid (ppid );
1575
1588
}
1576
1589
}
1577
1590
if (!PS (id ) && (data = zend_hash_str_find (& EG (symbol_table ), "_POST" , sizeof ("_POST" ) - 1 ))) {
1578
1591
ZVAL_DEREF (data );
1579
- if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), lensess ))) {
1592
+ if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1580
1593
ppid2sid (ppid );
1581
1594
}
1582
1595
}
@@ -1586,11 +1599,11 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1586
1599
if (!PS (id ) && zend_is_auto_global (ZSTR_KNOWN (ZEND_STR_AUTOGLOBAL_SERVER )) == SUCCESS &&
1587
1600
(data = zend_hash_str_find (Z_ARRVAL (PG (http_globals )[TRACK_VARS_SERVER ]), "REQUEST_URI" , sizeof ("REQUEST_URI" ) - 1 )) &&
1588
1601
Z_TYPE_P (data ) == IS_STRING &&
1589
- (p = strstr (Z_STRVAL_P (data ), PS (session_name ))) &&
1590
- p [lensess ] == '='
1602
+ (p = strstr (Z_STRVAL_P (data ), ZSTR_VAL ( PS (session_name ) ))) &&
1603
+ p [ZSTR_LEN ( PS ( session_name )) ] == '='
1591
1604
) {
1592
1605
char * q ;
1593
- p += lensess + 1 ;
1606
+ p += ZSTR_LEN ( PS ( session_name )) ;
1594
1607
if ((q = strpbrk (p , "/?\\" ))) {
1595
1608
PS (id ) = zend_string_init (p , q - p , 0 );
1596
1609
}
@@ -1671,7 +1684,7 @@ static zend_result php_session_reset(void) /* {{{ */
1671
1684
PHPAPI void session_adapt_url (const char * url , size_t url_len , char * * new_url , size_t * new_len ) /* {{{ */
1672
1685
{
1673
1686
if (APPLY_TRANS_SID && (PS (session_status ) == php_session_active )) {
1674
- * new_url = php_url_scanner_adapt_single_url (url , url_len , PS (session_name ), ZSTR_VAL (PS (id )), new_len , 1 );
1687
+ * new_url = php_url_scanner_adapt_single_url (url , url_len , ZSTR_VAL ( PS (session_name ) ), ZSTR_VAL (PS (id )), new_len , 1 );
1675
1688
}
1676
1689
}
1677
1690
/* }}} */
@@ -1892,7 +1905,8 @@ PHP_FUNCTION(session_name)
1892
1905
RETURN_FALSE ;
1893
1906
}
1894
1907
1895
- RETVAL_STRING (PS (session_name ));
1908
+ // TODO Prevent duplication???
1909
+ RETVAL_STR (zend_string_dup (PS (session_name ), false));
1896
1910
1897
1911
if (name ) {
1898
1912
ini_name = zend_string_init ("session.name" , sizeof ("session.name" ) - 1 , 0 );
@@ -2267,7 +2281,7 @@ PHP_FUNCTION(session_regenerate_id)
2267
2281
zend_string_release_ex (PS (id ), 0 );
2268
2282
PS (id ) = NULL ;
2269
2283
2270
- if (PS (mod )-> s_open (& PS (mod_data ), PS (save_path ), PS (session_name )) == FAILURE ) {
2284
+ if (PS (mod )-> s_open (& PS (mod_data ), PS (save_path ), ZSTR_VAL ( PS (session_name ) )) == FAILURE ) {
2271
2285
PS (session_status ) = php_session_none ;
2272
2286
if (!EG (exception )) {
2273
2287
zend_throw_error (NULL , "Failed to open session: %s (path: %s)" , PS (mod )-> s_name , PS (save_path ));
@@ -2935,7 +2949,7 @@ static bool early_find_sid_in(zval *dest, int where, php_session_rfc1867_progres
2935
2949
return 0 ;
2936
2950
}
2937
2951
2938
- if ((ppid = zend_hash_str_find (Z_ARRVAL (PG (http_globals )[where ]), PS (session_name ), progress -> sname_len ))
2952
+ if ((ppid = zend_hash_find (Z_ARRVAL (PG (http_globals )[where ]), PS (session_name )))
2939
2953
&& Z_TYPE_P (ppid ) == IS_STRING ) {
2940
2954
zval_ptr_dtor (dest );
2941
2955
ZVAL_COPY_DEREF (dest , ppid );
@@ -3043,7 +3057,8 @@ static zend_result php_session_rfc1867_callback(unsigned int event, void *event_
3043
3057
multipart_event_start * data = (multipart_event_start * ) event_data ;
3044
3058
progress = ecalloc (1 , sizeof (php_session_rfc1867_progress ));
3045
3059
progress -> content_length = data -> content_length ;
3046
- progress -> sname_len = strlen (PS (session_name ));
3060
+ // TODO Remove field?
3061
+ progress -> sname_len = ZSTR_LEN (PS (session_name ));
3047
3062
PS (rfc1867_progress ) = progress ;
3048
3063
}
3049
3064
break ;
@@ -3065,7 +3080,7 @@ static zend_result php_session_rfc1867_callback(unsigned int event, void *event_
3065
3080
if (data -> name && data -> value && value_len ) {
3066
3081
size_t name_len = strlen (data -> name );
3067
3082
3068
- if (name_len == progress -> sname_len && memcmp (data -> name , PS (session_name ), name_len ) == 0 ) {
3083
+ if (name_len == progress -> sname_len && memcmp (data -> name , ZSTR_VAL ( PS (session_name ) ), name_len ) == 0 ) {
3069
3084
zval_ptr_dtor (& progress -> sid );
3070
3085
ZVAL_STRINGL (& progress -> sid , (* data -> value ), value_len );
3071
3086
} else if (name_len == strlen (PS (rfc1867_name )) && memcmp (data -> name , PS (rfc1867_name ), name_len + 1 ) == 0 ) {
0 commit comments