1919#include "php_soap.h"
2020#include "ext/hash/php_hash.h" /* For php_hash_bin2hex() */
2121
22- static char * get_http_header_value_nodup (char * headers , char * type , size_t * len );
22+ static const char * get_http_header_value_nodup (const char * headers , size_t headers_len , const char * type , size_t type_len , size_t * len );
2323static char * get_http_header_value (zend_string * headers , char * type );
2424static zend_string * get_http_body (php_stream * stream , bool close , zend_string * headers );
2525static zend_string * get_http_headers (php_stream * stream );
@@ -353,8 +353,7 @@ bool make_http_soap_request(
353353 int use_proxy = 0 ;
354354 int use_ssl ;
355355 zend_string * http_body ;
356- char * content_type , * http_version , * cookie_itt ;
357- size_t cookie_len ;
356+ char * content_type , * http_version ;
358357 bool http_close ;
359358 zend_string * http_headers ;
360359 char * connection ;
@@ -1013,34 +1012,36 @@ bool make_http_soap_request(
10131012 we shouldn't be changing urls so path doesn't
10141013 matter too much
10151014 */
1016- cookie_itt = ZSTR_VAL (http_headers );
1015+ const char * cookie_itt = ZSTR_VAL (http_headers );
1016+ size_t cookie_len = ZSTR_LEN (http_headers );
1017+ size_t parsed_cookie_len ;
10171018
1018- while ((cookie_itt = get_http_header_value_nodup (cookie_itt , "Set-Cookie:" , & cookie_len ))) {
1019+ while ((cookie_itt = get_http_header_value_nodup (cookie_itt , cookie_len , ZEND_STRL ( "Set-Cookie:" ) , & parsed_cookie_len ))) {
10191020 zval * cookies = Z_CLIENT_COOKIES_P (this_ptr );
10201021 SEPARATE_ARRAY (cookies );
10211022
1022- char * cookie = estrndup (cookie_itt , cookie_len );
1023+ char * cookie = estrndup (cookie_itt , parsed_cookie_len );
10231024 char * eqpos = strstr (cookie , "=" );
10241025 char * sempos = strstr (cookie , ";" );
10251026 if (eqpos != NULL && (sempos == NULL || sempos > eqpos )) {
10261027 smart_str name = {0 };
1027- int cookie_len ;
1028+ size_t current_cookie_len ;
10281029 zval zcookie ;
10291030
10301031 if (sempos != NULL ) {
1031- cookie_len = sempos - (eqpos + 1 );
1032+ current_cookie_len = sempos - (eqpos + 1 );
10321033 } else {
1033- cookie_len = strlen ( cookie ) - (eqpos - cookie )- 1 ;
1034+ current_cookie_len = parsed_cookie_len - (eqpos - cookie )- 1 ;
10341035 }
10351036
10361037 smart_str_appendl (& name , cookie , eqpos - cookie );
10371038 smart_str_0 (& name );
10381039
10391040 array_init (& zcookie );
1040- add_index_stringl (& zcookie , 0 , eqpos + 1 , cookie_len );
1041+ add_index_stringl (& zcookie , 0 , eqpos + 1 , current_cookie_len );
10411042
10421043 if (sempos != NULL ) {
1043- char * options = cookie + cookie_len + 1 ;
1044+ char * options = cookie + current_cookie_len + 1 ;
10441045 while (* options ) {
10451046 while (* options == ' ' ) {options ++ ;}
10461047 sempos = strstr (options , ";" );
@@ -1076,7 +1077,8 @@ bool make_http_soap_request(
10761077 smart_str_free (& name );
10771078 }
10781079
1079- cookie_itt = cookie_itt + cookie_len ;
1080+ cookie_itt = cookie_itt + parsed_cookie_len ;
1081+ cookie_len -= parsed_cookie_len ;
10801082 efree (cookie );
10811083 }
10821084
@@ -1387,24 +1389,22 @@ bool make_http_soap_request(
13871389 return true;
13881390}
13891391
1390- static char * get_http_header_value_nodup (char * headers , char * type , size_t * len )
1392+ static const char * get_http_header_value_nodup (const char * headers , size_t headers_len , const char * type , size_t type_len , size_t * len )
13911393{
1392- char * pos , * tmp = NULL ;
1393- int typelen , headerslen ;
1394+ const char * pos ;
1395+ const char * tmp = NULL ;
13941396
1395- typelen = strlen (type );
1396- headerslen = strlen (headers );
13971397
13981398 /* header `titles' can be lower case, or any case combination, according
13991399 * to the various RFC's. */
14001400 pos = headers ;
14011401 do {
14021402 /* start of buffer or start of line */
1403- if (strncasecmp (pos , type , typelen ) == 0 ) {
1404- char * eol ;
1403+ if (strncasecmp (pos , type , type_len ) == 0 ) {
1404+ const char * eol ;
14051405
14061406 /* match */
1407- tmp = pos + typelen ;
1407+ tmp = pos + type_len ;
14081408
14091409 /* strip leading whitespace */
14101410 while (* tmp == ' ' || * tmp == '\t' ) {
@@ -1413,7 +1413,7 @@ static char *get_http_header_value_nodup(char *headers, char *type, size_t *len)
14131413
14141414 eol = strchr (tmp , '\n' );
14151415 if (eol == NULL ) {
1416- eol = headers + headerslen ;
1416+ eol = headers + headers_len ;
14171417 } else if (eol > tmp ) {
14181418 if (* (eol - 1 ) == '\r' ) {
14191419 eol -- ;
@@ -1443,9 +1443,7 @@ static char *get_http_header_value_nodup(char *headers, char *type, size_t *len)
14431443static char * get_http_header_value (zend_string * headers , char * type )
14441444{
14451445 size_t len ;
1446- char * value ;
1447-
1448- value = get_http_header_value_nodup (ZSTR_VAL (headers ), type , & len );
1446+ const char * value = get_http_header_value_nodup (ZSTR_VAL (headers ), ZSTR_LEN (headers ), type , strlen (type ), & len );
14491447
14501448 if (value ) {
14511449 return estrndup (value , len );
0 commit comments