Skip to content

Commit fa224b1

Browse files
author
Yasuo Ohgaki
committed
Fixed previous commit may delete unwanted cookies.
2 parents 383423a + 58f9434 commit fa224b1

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

ext/session/session.c

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,49 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */
12751275
#define COOKIE_SECURE "; secure"
12761276
#define COOKIE_HTTPONLY "; HttpOnly"
12771277

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+
12781321
static void php_session_send_cookie(TSRMLS_D) /* {{{ */
12791322
{
12801323
smart_str ncookie = {0};
@@ -1343,7 +1386,8 @@ static void php_session_send_cookie(TSRMLS_D) /* {{{ */
13431386

13441387
smart_str_0(&ncookie);
13451388

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);
13471391
}
13481392
/* }}} */
13491393

0 commit comments

Comments
 (0)