@@ -1275,6 +1275,49 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */
1275
1275
#define COOKIE_SECURE "; secure"
1276
1276
#define COOKIE_HTTPONLY "; HttpOnly"
1277
1277
1278
+ /*
1279
+ * Remove already sent session ID cookie.
1280
+ * It must be directly removed from SG(sapi_header) because sapi_add_header_ex()
1281
+ * removes all of matching cookie. i.e. It deletes all of Set-Cookie headers.
1282
+ */
1283
+ static void php_session_remove_cookie () {
1284
+ sapi_header_struct * header ;
1285
+ zend_llist * l = & SG (sapi_headers ).headers ;
1286
+ zend_llist_element * next ;
1287
+ zend_llist_element * current ;
1288
+ char * session_cookie , * e_session_name ;
1289
+ int session_cookie_len , len = sizeof ("Set-Cookie" )- 1 ;
1290
+
1291
+ e_session_name = php_url_encode (PS (session_name ), strlen (PS (session_name )), NULL );
1292
+ spprintf (& session_cookie , 0 , "Set-Cookie: %s=" , e_session_name );
1293
+ efree (e_session_name );
1294
+
1295
+ session_cookie_len = strlen (session_cookie );
1296
+ current = l -> head ;
1297
+ while (current ) {
1298
+ header = (sapi_header_struct * )(current -> data );
1299
+ next = current -> next ;
1300
+ if (header -> header_len > len && header -> header [len ] == ':'
1301
+ && !strncmp (header -> header , session_cookie , session_cookie_len )) {
1302
+ if (current -> prev ) {
1303
+ current -> prev -> next = next ;
1304
+ } else {
1305
+ l -> head = next ;
1306
+ }
1307
+ if (next ) {
1308
+ next -> prev = current -> prev ;
1309
+ } else {
1310
+ l -> tail = current -> prev ;
1311
+ }
1312
+ sapi_free_header (header );
1313
+ efree (current );
1314
+ -- l -> count ;
1315
+ }
1316
+ current = next ;
1317
+ }
1318
+ efree (session_cookie );
1319
+ }
1320
+
1278
1321
static void php_session_send_cookie (TSRMLS_D ) /* {{{ */
1279
1322
{
1280
1323
smart_str ncookie = {0 };
@@ -1343,7 +1386,8 @@ static void php_session_send_cookie(TSRMLS_D) /* {{{ */
1343
1386
1344
1387
smart_str_0 (& ncookie );
1345
1388
1346
- sapi_add_header_ex (ncookie .c , ncookie .len , 0 , 1 TSRMLS_CC );
1389
+ php_session_remove_cookie (); /* remove already sent session ID cookie */
1390
+ sapi_add_header_ex (ncookie .c , ncookie .len , 0 , 0 TSRMLS_CC );
1347
1391
}
1348
1392
/* }}} */
1349
1393
0 commit comments