Skip to content

Commit 1e4db48

Browse files
committed
ext/soap/php_http.c: Refactor get_http_header_value_nodup()
- Pass lengths to prevent strlen() for known lengths
1 parent 2951aea commit 1e4db48

File tree

1 file changed

+22
-24
lines changed

1 file changed

+22
-24
lines changed

ext/soap/php_http.c

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
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);
2323
static char *get_http_header_value(zend_string *headers, char *type);
2424
static zend_string *get_http_body(php_stream *stream, bool close, zend_string *headers);
2525
static 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)
14431443
static 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

Comments
 (0)