@@ -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 ();
@@ -648,24 +648,41 @@ static PHP_INI_MH(OnUpdateName) /* {{{ */
648
648
SESSION_CHECK_ACTIVE_STATE ;
649
649
SESSION_CHECK_OUTPUT_STATE ;
650
650
651
- /* Numeric session.name won't work at all */
652
- if ((!ZSTR_LEN (new_value ) || is_numeric_string (ZSTR_VAL (new_value ), ZSTR_LEN (new_value ), NULL , NULL , 0 ))) {
653
- int err_type ;
651
+ int err_type ;
654
652
655
- if (stage == ZEND_INI_STAGE_RUNTIME || stage == ZEND_INI_STAGE_ACTIVATE || stage == ZEND_INI_STAGE_STARTUP ) {
656
- err_type = E_WARNING ;
657
- } else {
658
- err_type = E_ERROR ;
659
- }
653
+ if (stage == ZEND_INI_STAGE_RUNTIME || stage == ZEND_INI_STAGE_ACTIVATE || stage == ZEND_INI_STAGE_STARTUP ) {
654
+ err_type = E_WARNING ;
655
+ } else {
656
+ err_type = E_ERROR ;
657
+ }
660
658
659
+ if (ZSTR_LEN (new_value ) == 0 ) {
660
+ /* Do not output error when restoring ini options. */
661
+ if (stage != ZEND_INI_STAGE_DEACTIVATE ) {
662
+ php_error_docref (NULL , err_type , "session.name \"%s\" cannot be empty" , ZSTR_VAL (new_value ));
663
+ }
664
+ return FAILURE ;
665
+ }
666
+ /* Nul bytes are not allowed */
667
+ if (ZSTR_LEN (new_value ) != strlen (ZSTR_VAL (new_value ))) {
668
+ /* Do not output error when restoring ini options. */
669
+ if (stage != ZEND_INI_STAGE_DEACTIVATE ) {
670
+ php_error_docref (NULL , err_type , "session.name \"%s\" cannot contain nul bytes" , ZSTR_VAL (new_value ));
671
+ }
672
+ return FAILURE ;
673
+ }
674
+ /* Numeric session.name won't work at all */
675
+ if (is_numeric_str_function (new_value , NULL , NULL )) {
661
676
/* Do not output error when restoring ini options. */
662
677
if (stage != ZEND_INI_STAGE_DEACTIVATE ) {
663
678
php_error_docref (NULL , err_type , "session.name \"%s\" cannot be numeric or empty" , ZSTR_VAL (new_value ));
664
679
}
665
680
return FAILURE ;
666
681
}
667
682
668
- return OnUpdateStringUnempty (entry , new_value , mh_arg1 , mh_arg2 , mh_arg3 , stage );
683
+ zend_string * * p = (zend_string * * ) ZEND_INI_GET_ADDR ();
684
+ * p = new_value ;
685
+ return SUCCESS ;
669
686
}
670
687
/* }}} */
671
688
@@ -1251,9 +1268,10 @@ static void php_session_remove_cookie(void) {
1251
1268
size_t session_cookie_len ;
1252
1269
size_t len = sizeof ("Set-Cookie" )- 1 ;
1253
1270
1254
- ZEND_ASSERT (strpbrk (PS (session_name ), "=,; \t\r\n\013\014" ) == NULL );
1255
- spprintf (& session_cookie , 0 , "Set-Cookie: %s=" , PS (session_name ));
1271
+ ZEND_ASSERT (strpbrk (ZSTR_VAL ( PS (session_name ) ), "=,; \t\r\n\013\014" ) == NULL );
1272
+ spprintf (& session_cookie , 0 , "Set-Cookie: %s=" , ZSTR_VAL ( PS (session_name ) ));
1256
1273
1274
+ // TODO Manually compute from known information?
1257
1275
session_cookie_len = strlen (session_cookie );
1258
1276
current = l -> head ;
1259
1277
while (current ) {
@@ -1298,8 +1316,9 @@ static zend_result php_session_send_cookie(void) /* {{{ */
1298
1316
return FAILURE ;
1299
1317
}
1300
1318
1319
+ // TODO need to Check for nul byte?
1301
1320
/* Prevent broken Set-Cookie header, because the session_name might be user supplied */
1302
- if (strpbrk (PS (session_name ), "=,; \t\r\n\013\014" ) != NULL ) { /* man isspace for \013 and \014 */
1321
+ if (strpbrk (ZSTR_VAL ( PS (session_name ) ), "=,; \t\r\n\013\014" ) != NULL ) { /* man isspace for \013 and \014 */
1303
1322
php_error_docref (NULL , E_WARNING , "session.name cannot contain any of the following '=,; \\t\\r\\n\\013\\014'" );
1304
1323
return FAILURE ;
1305
1324
}
@@ -1308,7 +1327,7 @@ static zend_result php_session_send_cookie(void) /* {{{ */
1308
1327
e_id = php_url_encode (ZSTR_VAL (PS (id )), ZSTR_LEN (PS (id )));
1309
1328
1310
1329
smart_str_appendl (& ncookie , "Set-Cookie: " , sizeof ("Set-Cookie: " )- 1 );
1311
- smart_str_appendl (& ncookie , PS (session_name ), strlen ( PS ( session_name ) ));
1330
+ smart_str_append (& ncookie , PS (session_name ));
1312
1331
smart_str_appendc (& ncookie , '=' );
1313
1332
smart_str_appendl (& ncookie , ZSTR_VAL (e_id ), ZSTR_LEN (e_id ));
1314
1333
@@ -1434,7 +1453,7 @@ PHPAPI zend_result php_session_reset_id(void) /* {{{ */
1434
1453
if (PS (define_sid )) {
1435
1454
smart_str var = {0 };
1436
1455
1437
- smart_str_appends (& var , PS (session_name ));
1456
+ smart_str_append (& var , PS (session_name ));
1438
1457
smart_str_appendc (& var , '=' );
1439
1458
smart_str_appends (& var , ZSTR_VAL (PS (id )));
1440
1459
smart_str_0 (& var );
@@ -1462,18 +1481,15 @@ PHPAPI zend_result php_session_reset_id(void) /* {{{ */
1462
1481
(data = zend_hash_str_find (& EG (symbol_table ), "_COOKIE" , sizeof ("_COOKIE" ) - 1 ))) {
1463
1482
ZVAL_DEREF (data );
1464
1483
if (Z_TYPE_P (data ) == IS_ARRAY &&
1465
- (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), strlen ( PS ( session_name ) )))) {
1484
+ (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1466
1485
ZVAL_DEREF (ppid );
1467
1486
apply_trans_sid = 0 ;
1468
1487
}
1469
1488
}
1470
1489
}
1471
1490
if (apply_trans_sid ) {
1472
- zend_string * sname ;
1473
- sname = zend_string_init (PS (session_name ), strlen (PS (session_name )), 0 );
1474
- php_url_scanner_reset_session_var (sname , 1 ); /* This may fail when session name has changed */
1475
- zend_string_release_ex (sname , 0 );
1476
- php_url_scanner_add_session_var (PS (session_name ), strlen (PS (session_name )), ZSTR_VAL (PS (id )), ZSTR_LEN (PS (id )), 1 );
1491
+ php_url_scanner_reset_session_var (PS (session_name ), 1 ); /* This may fail when session name has changed */
1492
+ 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 );
1477
1493
}
1478
1494
return SUCCESS ;
1479
1495
}
@@ -1485,7 +1501,6 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1485
1501
zval * ppid ;
1486
1502
zval * data ;
1487
1503
char * p , * value ;
1488
- size_t lensess ;
1489
1504
1490
1505
switch (PS (session_status )) {
1491
1506
case php_session_active :
@@ -1520,8 +1535,6 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1520
1535
PS (send_cookie ) = PS (use_cookies ) || PS (use_only_cookies );
1521
1536
}
1522
1537
1523
- lensess = strlen (PS (session_name ));
1524
-
1525
1538
/*
1526
1539
* Cookies are preferred, because initially cookie and get
1527
1540
* variables will be available.
@@ -1533,7 +1546,7 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1533
1546
if (!PS (id )) {
1534
1547
if (PS (use_cookies ) && (data = zend_hash_str_find (& EG (symbol_table ), "_COOKIE" , sizeof ("_COOKIE" ) - 1 ))) {
1535
1548
ZVAL_DEREF (data );
1536
- if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), lensess ))) {
1549
+ if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1537
1550
ppid2sid (ppid );
1538
1551
PS (send_cookie ) = 0 ;
1539
1552
PS (define_sid ) = 0 ;
@@ -1543,13 +1556,13 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1543
1556
if (!PS (use_only_cookies )) {
1544
1557
if (!PS (id ) && (data = zend_hash_str_find (& EG (symbol_table ), "_GET" , sizeof ("_GET" ) - 1 ))) {
1545
1558
ZVAL_DEREF (data );
1546
- if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), lensess ))) {
1559
+ if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1547
1560
ppid2sid (ppid );
1548
1561
}
1549
1562
}
1550
1563
if (!PS (id ) && (data = zend_hash_str_find (& EG (symbol_table ), "_POST" , sizeof ("_POST" ) - 1 ))) {
1551
1564
ZVAL_DEREF (data );
1552
- if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_str_find (Z_ARRVAL_P (data ), PS (session_name ), lensess ))) {
1565
+ if (Z_TYPE_P (data ) == IS_ARRAY && (ppid = zend_hash_find (Z_ARRVAL_P (data ), PS (session_name )))) {
1553
1566
ppid2sid (ppid );
1554
1567
}
1555
1568
}
@@ -1559,11 +1572,11 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
1559
1572
if (!PS (id ) && zend_is_auto_global (ZSTR_KNOWN (ZEND_STR_AUTOGLOBAL_SERVER )) == SUCCESS &&
1560
1573
(data = zend_hash_str_find (Z_ARRVAL (PG (http_globals )[TRACK_VARS_SERVER ]), "REQUEST_URI" , sizeof ("REQUEST_URI" ) - 1 )) &&
1561
1574
Z_TYPE_P (data ) == IS_STRING &&
1562
- (p = strstr (Z_STRVAL_P (data ), PS (session_name ))) &&
1563
- p [lensess ] == '='
1575
+ (p = strstr (Z_STRVAL_P (data ), ZSTR_VAL ( PS (session_name ) ))) &&
1576
+ p [ZSTR_LEN ( PS ( session_name )) ] == '='
1564
1577
) {
1565
1578
char * q ;
1566
- p += lensess + 1 ;
1579
+ p += ZSTR_LEN ( PS ( session_name )) ;
1567
1580
if ((q = strpbrk (p , "/?\\" ))) {
1568
1581
PS (id ) = zend_string_init (p , q - p , 0 );
1569
1582
}
@@ -1644,7 +1657,7 @@ static zend_result php_session_reset(void) /* {{{ */
1644
1657
PHPAPI void session_adapt_url (const char * url , size_t url_len , char * * new_url , size_t * new_len ) /* {{{ */
1645
1658
{
1646
1659
if (APPLY_TRANS_SID && (PS (session_status ) == php_session_active )) {
1647
- * new_url = php_url_scanner_adapt_single_url (url , url_len , PS (session_name ), ZSTR_VAL (PS (id )), new_len , 1 );
1660
+ * new_url = php_url_scanner_adapt_single_url (url , url_len , ZSTR_VAL ( PS (session_name ) ), ZSTR_VAL (PS (id )), new_len , 1 );
1648
1661
}
1649
1662
}
1650
1663
/* }}} */
@@ -1865,7 +1878,8 @@ PHP_FUNCTION(session_name)
1865
1878
RETURN_FALSE ;
1866
1879
}
1867
1880
1868
- RETVAL_STRING (PS (session_name ));
1881
+ // TODO Prevent duplication???
1882
+ RETVAL_STR (zend_string_dup (PS (session_name ), false));
1869
1883
1870
1884
if (name ) {
1871
1885
ini_name = zend_string_init ("session.name" , sizeof ("session.name" ) - 1 , 0 );
@@ -2240,7 +2254,7 @@ PHP_FUNCTION(session_regenerate_id)
2240
2254
zend_string_release_ex (PS (id ), 0 );
2241
2255
PS (id ) = NULL ;
2242
2256
2243
- if (PS (mod )-> s_open (& PS (mod_data ), PS (save_path ), PS (session_name )) == FAILURE ) {
2257
+ if (PS (mod )-> s_open (& PS (mod_data ), PS (save_path ), ZSTR_VAL ( PS (session_name ) )) == FAILURE ) {
2244
2258
PS (session_status ) = php_session_none ;
2245
2259
if (!EG (exception )) {
2246
2260
zend_throw_error (NULL , "Failed to open session: %s (path: %s)" , PS (mod )-> s_name , PS (save_path ));
@@ -2906,7 +2920,7 @@ static bool early_find_sid_in(zval *dest, int where, php_session_rfc1867_progres
2906
2920
return 0 ;
2907
2921
}
2908
2922
2909
- if ((ppid = zend_hash_str_find (Z_ARRVAL (PG (http_globals )[where ]), PS (session_name ), progress -> sname_len ))
2923
+ if ((ppid = zend_hash_find (Z_ARRVAL (PG (http_globals )[where ]), PS (session_name )))
2910
2924
&& Z_TYPE_P (ppid ) == IS_STRING ) {
2911
2925
zval_ptr_dtor (dest );
2912
2926
ZVAL_COPY_DEREF (dest , ppid );
@@ -3014,7 +3028,8 @@ static zend_result php_session_rfc1867_callback(unsigned int event, void *event_
3014
3028
multipart_event_start * data = (multipart_event_start * ) event_data ;
3015
3029
progress = ecalloc (1 , sizeof (php_session_rfc1867_progress ));
3016
3030
progress -> content_length = data -> content_length ;
3017
- progress -> sname_len = strlen (PS (session_name ));
3031
+ // TODO Remove field?
3032
+ progress -> sname_len = ZSTR_LEN (PS (session_name ));
3018
3033
PS (rfc1867_progress ) = progress ;
3019
3034
}
3020
3035
break ;
@@ -3036,7 +3051,7 @@ static zend_result php_session_rfc1867_callback(unsigned int event, void *event_
3036
3051
if (data -> name && data -> value && value_len ) {
3037
3052
size_t name_len = strlen (data -> name );
3038
3053
3039
- if (name_len == progress -> sname_len && memcmp (data -> name , PS (session_name ), name_len ) == 0 ) {
3054
+ if (name_len == progress -> sname_len && memcmp (data -> name , ZSTR_VAL ( PS (session_name ) ), name_len ) == 0 ) {
3040
3055
zval_ptr_dtor (& progress -> sid );
3041
3056
ZVAL_STRINGL (& progress -> sid , (* data -> value ), value_len );
3042
3057
} else if (name_len == strlen (PS (rfc1867_name )) && memcmp (data -> name , PS (rfc1867_name ), name_len + 1 ) == 0 ) {
0 commit comments