summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2012-04-04 16:16:54 +0800
committerXinchen Hui <laruence@gmail.com>2012-04-04 16:16:54 +0800
commit06290cc04991f9a8563413ece6123051d1cd6312 (patch)
treeafa37b313b56cb14d85322ae5901e8d6928db51c /main
parent0421ef5e2e8661cf5c9f77232dc3d330d6f84814 (diff)
parentefd671f242e87e3301a1b3e76179955f26119feb (diff)
downloadphp-git-06290cc04991f9a8563413ece6123051d1cd6312.tar.gz
Merge branch 'PHP-5.4'
* PHP-5.4: Fixed bug #61605 (header_remove() does not remove all headers) Conflicts: NEWS
Diffstat (limited to 'main')
-rw-r--r--main/SAPI.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/main/SAPI.c b/main/SAPI.c
index 74fdbb2c4a..0d3b4ef17a 100644
--- a/main/SAPI.c
+++ b/main/SAPI.c
@@ -587,10 +587,36 @@ static void sapi_update_response_code(int ncode TSRMLS_DC)
SG(sapi_headers).http_response_code = ncode;
}
-static int sapi_find_matching_header(void *element1, void *element2)
-{
- int len = strlen((char*)element2);
- return strncasecmp(((sapi_header_struct*)element1)->header, (char*)element2, len) == 0 && ((sapi_header_struct*)element1)->header[len] == ':';
+/*
+ * since zend_llist_del_element only remove one matched item once,
+ * we should remove them by ourself
+ */
+static void sapi_remove_header(zend_llist *l, char *name, uint len) {
+ sapi_header_struct *header;
+ zend_llist_element *next;
+ zend_llist_element *current=l->head;
+
+ while (current) {
+ header = (sapi_header_struct *)(current->data);
+ next = current->next;
+ if (header->header_len > len && header->header[len] == ':'
+ && !strncasecmp(header->header, name, len)) {
+ if (current->prev) {
+ current->prev->next = next;
+ } else {
+ l->head = next;
+ }
+ if (next) {
+ next->prev = current->prev;
+ } else {
+ l->tail = current->prev;
+ }
+ sapi_free_header(header);
+ efree(current);
+ --l->count;
+ }
+ current = next;
+ }
}
SAPI_API int sapi_add_header_ex(char *header_line, uint header_line_len, zend_bool duplicate, zend_bool replace TSRMLS_DC)
@@ -621,7 +647,7 @@ static void sapi_header_add_op(sapi_header_op_enum op, sapi_header_struct *sapi_
char sav = *colon_offset;
*colon_offset = 0;
- zend_llist_del_element(&SG(sapi_headers).headers, sapi_header->header, (int(*)(void*, void*))sapi_find_matching_header);
+ sapi_remove_header(&SG(sapi_headers).headers, sapi_header->header, strlen(sapi_header->header));
*colon_offset = sav;
}
}
@@ -703,7 +729,7 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC)
sapi_header.header_len = header_line_len;
sapi_module.header_handler(&sapi_header, op, &SG(sapi_headers) TSRMLS_CC);
}
- zend_llist_del_element(&SG(sapi_headers).headers, header_line, (int(*)(void*, void*))sapi_find_matching_header);
+ sapi_remove_header(&SG(sapi_headers).headers, header_line, header_line_len);
efree(header_line);
return SUCCESS;
} else {