summaryrefslogtreecommitdiff
path: root/ext/standard/url_scanner_ex.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/url_scanner_ex.c')
-rw-r--r--ext/standard/url_scanner_ex.c175
1 files changed, 88 insertions, 87 deletions
diff --git a/ext/standard/url_scanner_ex.c b/ext/standard/url_scanner_ex.c
index 08ccd0207f..d71c97a28d 100644
--- a/ext/standard/url_scanner_ex.c
+++ b/ext/standard/url_scanner_ex.c
@@ -115,7 +115,7 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st
const char *bash = NULL;
const char *sep = "?";
- q = (p = url->c) + url->len;
+ q = (p = url->s->val) + url->s->len;
scan:
@@ -194,13 +194,13 @@ yy8:
done:
/* Don't modify URLs of the format "#mark" */
- if (bash && bash - url->c == 0) {
+ if (bash && bash - url->s->val == 0) {
smart_str_append(dest, url);
return;
}
if (bash)
- smart_str_appendl(dest, url->c, bash - url->c);
+ smart_str_appendl(dest, url->s->val, bash - url->s->val);
else
smart_str_append(dest, url);
@@ -222,7 +222,7 @@ static inline void tag_arg(url_adapt_state_ex_t *ctx, char quotes, char type TSR
{
char f = 0;
- if (strncasecmp(ctx->arg.c, ctx->lookup_data, ctx->arg.len) == 0)
+ if (strncasecmp(ctx->arg.s->val, ctx->lookup_data, ctx->arg.s->len) == 0)
f = 1;
if (quotes)
@@ -276,18 +276,18 @@ static void handle_form(STD_PARA)
{
int doit = 0;
- if (ctx->form_app.len > 0) {
- switch (ctx->tag.len) {
+ if (ctx->form_app.s->len > 0) {
+ switch (ctx->tag.s->len) {
case sizeof("form") - 1:
- if (!strncasecmp(ctx->tag.c, "form", sizeof("form") - 1)) {
+ if (!strncasecmp(ctx->tag.s->val, "form", sizeof("form") - 1)) {
doit = 1;
}
- if (doit && ctx->val.c && ctx->lookup_data && *ctx->lookup_data) {
- char *e, *p = zend_memnstr(ctx->val.c, "://", sizeof("://") - 1, ctx->val.c + ctx->val.len);
+ if (doit && ctx->val.s->val && ctx->lookup_data && *ctx->lookup_data) {
+ char *e, *p = (char *)zend_memnstr(ctx->val.s->val, "://", sizeof("://") - 1, ctx->val.s->val + ctx->val.s->len);
if (p) {
- e = memchr(p, '/', (ctx->val.c + ctx->val.len) - p);
+ e = memchr(p, '/', (ctx->val.s->val + ctx->val.s->len) - p);
if (!e) {
- e = ctx->val.c + ctx->val.len;
+ e = ctx->val.s->val + ctx->val.s->len;
}
if ((e - p) && strncasecmp(p, ctx->lookup_data, (e - p))) {
doit = 0;
@@ -297,7 +297,7 @@ static void handle_form(STD_PARA)
break;
case sizeof("fieldset") - 1:
- if (!strncasecmp(ctx->tag.c, "fieldset", sizeof("fieldset") - 1)) {
+ if (!strncasecmp(ctx->tag.s->val, "fieldset", sizeof("fieldset") - 1)) {
doit = 1;
}
break;
@@ -320,18 +320,19 @@ static inline void handle_tag(STD_PARA)
int ok = 0;
unsigned int i;
- ctx->tag.len = 0;
+ ctx->tag.s->len = 0;
smart_str_appendl(&ctx->tag, start, YYCURSOR - start);
- for (i = 0; i < ctx->tag.len; i++)
- ctx->tag.c[i] = tolower((int)(unsigned char)ctx->tag.c[i]);
- if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ctx->tag.c, ctx->tag.len)) != NULL)
+ for (i = 0; i < ctx->tag.s->len; i++)
+ ctx->tag.s->val[i] = tolower((int)(unsigned char)ctx->tag.s->val[i]);
+ /* intentionally using str_find here, in case the hash value is set, but the string val is changed later */
+ if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ctx->tag.s->val, ctx->tag.s->len)) != NULL)
ok = 1;
STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN;
}
static inline void handle_arg(STD_PARA)
{
- ctx->arg.len = 0;
+ ctx->arg.s->len = 0;
smart_str_appendl(&ctx->arg, start, YYCURSOR - start);
}
@@ -350,8 +351,8 @@ static inline void xx_mainloop(url_adapt_state_ex_t *ctx, const char *newdata, s
smart_str_appendl(&ctx->buf, newdata, newlen);
- YYCURSOR = ctx->buf.c;
- YYLIMIT = ctx->buf.c + ctx->buf.len;
+ YYCURSOR = ctx->buf.s->val;
+ YYLIMIT = ctx->buf.s->val + ctx->buf.s->len;
switch (STATE) {
case STATE_PLAIN: goto state_plain;
@@ -369,7 +370,7 @@ state_plain_begin:
state_plain:
start = YYCURSOR;
-#line 373 "ext/standard/url_scanner_ex.c"
+#line 374 "ext/standard/url_scanner_ex.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -412,9 +413,9 @@ state_plain:
goto yy15;
}
++YYCURSOR;
-#line 308 "ext/standard/url_scanner_ex.re"
+#line 309 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); STATE = STATE_TAG; goto state_tag; }
-#line 418 "ext/standard/url_scanner_ex.c"
+#line 419 "ext/standard/url_scanner_ex.c"
yy15:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -422,17 +423,17 @@ yy15:
if (yybm[0+yych] & 128) {
goto yy15;
}
-#line 309 "ext/standard/url_scanner_ex.re"
+#line 310 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); goto state_plain; }
-#line 428 "ext/standard/url_scanner_ex.c"
+#line 429 "ext/standard/url_scanner_ex.c"
}
-#line 310 "ext/standard/url_scanner_ex.re"
+#line 311 "ext/standard/url_scanner_ex.re"
state_tag:
start = YYCURSOR;
-#line 436 "ext/standard/url_scanner_ex.c"
+#line 437 "ext/standard/url_scanner_ex.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -483,14 +484,14 @@ yy20:
yych = *YYCURSOR;
goto yy25;
yy21:
-#line 315 "ext/standard/url_scanner_ex.re"
+#line 316 "ext/standard/url_scanner_ex.re"
{ handle_tag(STD_ARGS); /* Sets STATE */; passthru(STD_ARGS); if (STATE == STATE_PLAIN) goto state_plain; else goto state_next_arg; }
-#line 489 "ext/standard/url_scanner_ex.c"
+#line 490 "ext/standard/url_scanner_ex.c"
yy22:
++YYCURSOR;
-#line 316 "ext/standard/url_scanner_ex.re"
+#line 317 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); goto state_plain_begin; }
-#line 494 "ext/standard/url_scanner_ex.c"
+#line 495 "ext/standard/url_scanner_ex.c"
yy24:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -501,7 +502,7 @@ yy25:
}
goto yy21;
}
-#line 317 "ext/standard/url_scanner_ex.re"
+#line 318 "ext/standard/url_scanner_ex.re"
state_next_arg_begin:
@@ -510,7 +511,7 @@ state_next_arg_begin:
state_next_arg:
start = YYCURSOR;
-#line 514 "ext/standard/url_scanner_ex.c"
+#line 515 "ext/standard/url_scanner_ex.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -575,28 +576,28 @@ yy28:
++YYCURSOR;
if ((yych = *YYCURSOR) == '>') goto yy39;
yy29:
-#line 328 "ext/standard/url_scanner_ex.re"
+#line 329 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); goto state_plain_begin; }
-#line 581 "ext/standard/url_scanner_ex.c"
+#line 582 "ext/standard/url_scanner_ex.c"
yy30:
++YYCURSOR;
yy31:
-#line 325 "ext/standard/url_scanner_ex.re"
+#line 326 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); handle_form(STD_ARGS); goto state_plain_begin; }
-#line 587 "ext/standard/url_scanner_ex.c"
+#line 588 "ext/standard/url_scanner_ex.c"
yy32:
++YYCURSOR;
yych = *YYCURSOR;
goto yy38;
yy33:
-#line 326 "ext/standard/url_scanner_ex.re"
+#line 327 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); goto state_next_arg; }
-#line 595 "ext/standard/url_scanner_ex.c"
+#line 596 "ext/standard/url_scanner_ex.c"
yy34:
++YYCURSOR;
-#line 327 "ext/standard/url_scanner_ex.re"
+#line 328 "ext/standard/url_scanner_ex.re"
{ --YYCURSOR; STATE = STATE_ARG; goto state_arg; }
-#line 600 "ext/standard/url_scanner_ex.c"
+#line 601 "ext/standard/url_scanner_ex.c"
yy36:
yych = *++YYCURSOR;
goto yy29;
@@ -614,13 +615,13 @@ yy39:
yych = *YYCURSOR;
goto yy31;
}
-#line 329 "ext/standard/url_scanner_ex.re"
+#line 330 "ext/standard/url_scanner_ex.re"
state_arg:
start = YYCURSOR;
-#line 624 "ext/standard/url_scanner_ex.c"
+#line 625 "ext/standard/url_scanner_ex.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -668,14 +669,14 @@ yy42:
yych = *YYCURSOR;
goto yy47;
yy43:
-#line 334 "ext/standard/url_scanner_ex.re"
+#line 335 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); handle_arg(STD_ARGS); STATE = STATE_BEFORE_VAL; goto state_before_val; }
-#line 674 "ext/standard/url_scanner_ex.c"
+#line 675 "ext/standard/url_scanner_ex.c"
yy44:
++YYCURSOR;
-#line 335 "ext/standard/url_scanner_ex.re"
+#line 336 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); STATE = STATE_NEXT_ARG; goto state_next_arg; }
-#line 679 "ext/standard/url_scanner_ex.c"
+#line 680 "ext/standard/url_scanner_ex.c"
yy46:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -686,13 +687,13 @@ yy47:
}
goto yy43;
}
-#line 336 "ext/standard/url_scanner_ex.re"
+#line 337 "ext/standard/url_scanner_ex.re"
state_before_val:
start = YYCURSOR;
-#line 696 "ext/standard/url_scanner_ex.c"
+#line 697 "ext/standard/url_scanner_ex.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -739,17 +740,17 @@ yy50:
if (yych == ' ') goto yy57;
if (yych == '=') goto yy55;
yy51:
-#line 342 "ext/standard/url_scanner_ex.re"
+#line 343 "ext/standard/url_scanner_ex.re"
{ --YYCURSOR; goto state_next_arg_begin; }
-#line 745 "ext/standard/url_scanner_ex.c"
+#line 746 "ext/standard/url_scanner_ex.c"
yy52:
++YYCURSOR;
yych = *YYCURSOR;
goto yy56;
yy53:
-#line 341 "ext/standard/url_scanner_ex.re"
+#line 342 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); STATE = STATE_VAL; goto state_val; }
-#line 753 "ext/standard/url_scanner_ex.c"
+#line 754 "ext/standard/url_scanner_ex.c"
yy54:
yych = *++YYCURSOR;
goto yy51;
@@ -771,14 +772,14 @@ yy57:
YYCURSOR = YYMARKER;
goto yy51;
}
-#line 343 "ext/standard/url_scanner_ex.re"
+#line 344 "ext/standard/url_scanner_ex.re"
state_val:
start = YYCURSOR;
-#line 782 "ext/standard/url_scanner_ex.c"
+#line 783 "ext/standard/url_scanner_ex.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -839,9 +840,9 @@ state_val:
yych = *(YYMARKER = ++YYCURSOR);
if (yych != '>') goto yy76;
yy63:
-#line 352 "ext/standard/url_scanner_ex.re"
+#line 353 "ext/standard/url_scanner_ex.re"
{ passthru(STD_ARGS); goto state_next_arg_begin; }
-#line 845 "ext/standard/url_scanner_ex.c"
+#line 846 "ext/standard/url_scanner_ex.c"
yy64:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == '>') goto yy63;
@@ -851,9 +852,9 @@ yy65:
yych = *YYCURSOR;
goto yy69;
yy66:
-#line 351 "ext/standard/url_scanner_ex.re"
+#line 352 "ext/standard/url_scanner_ex.re"
{ handle_val(STD_ARGS, 0, ' '); goto state_next_arg_begin; }
-#line 857 "ext/standard/url_scanner_ex.c"
+#line 858 "ext/standard/url_scanner_ex.c"
yy67:
yych = *++YYCURSOR;
goto yy63;
@@ -880,9 +881,9 @@ yy72:
goto yy63;
yy73:
++YYCURSOR;
-#line 350 "ext/standard/url_scanner_ex.re"
+#line 351 "ext/standard/url_scanner_ex.re"
{ handle_val(STD_ARGS, 1, '\''); goto state_next_arg_begin; }
-#line 886 "ext/standard/url_scanner_ex.c"
+#line 887 "ext/standard/url_scanner_ex.c"
yy75:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -893,11 +894,11 @@ yy76:
}
if (yych >= '>') goto yy72;
++YYCURSOR;
-#line 349 "ext/standard/url_scanner_ex.re"
+#line 350 "ext/standard/url_scanner_ex.re"
{ handle_val(STD_ARGS, 1, '"'); goto state_next_arg_begin; }
-#line 899 "ext/standard/url_scanner_ex.c"
+#line 900 "ext/standard/url_scanner_ex.c"
}
-#line 353 "ext/standard/url_scanner_ex.re"
+#line 354 "ext/standard/url_scanner_ex.re"
stop:
@@ -906,12 +907,13 @@ stop:
/* XXX: Crash avoidance. Need to work with reporter to figure out what goes wrong */
if (rest < 0) rest = 0;
- if (rest) memmove(ctx->buf.c, start, rest);
- ctx->buf.len = rest;
+ if (rest) memmove(ctx->buf.s->val, start, rest);
+ ctx->buf.s->len = rest;
}
char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC)
{
+ char *result;
smart_str surl = {0};
smart_str buf = {0};
smart_str url_app = {0};
@@ -925,11 +927,13 @@ char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const cha
append_modified_url(&surl, &buf, &url_app, PG(arg_separator).output);
smart_str_0(&buf);
- if (newlen) *newlen = buf.len;
+ if (newlen) *newlen = buf.s->len;
+ result = estrndup(buf.s->val, buf.s->len);
smart_str_free(&url_app);
+ smart_str_free(&buf);
- return buf.c;
+ return result;
}
@@ -942,19 +946,18 @@ static char *url_adapt_ext(const char *src, size_t srclen, size_t *newlen, zend_
xx_mainloop(ctx, src, srclen TSRMLS_CC);
- *newlen = ctx->result.len;
- if (!ctx->result.c) {
+ *newlen = ctx->result.s->len;
+ if (!ctx->result.s) {
smart_str_appendl(&ctx->result, "", 0);
}
smart_str_0(&ctx->result);
if (do_flush) {
- smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
- *newlen += ctx->buf.len;
+ smart_str_appendl(&ctx->result, ctx->buf.s->val, ctx->buf.s->len);
+ *newlen += ctx->buf.s->len;
smart_str_free(&ctx->buf);
}
- retval = ctx->result.c;
- ctx->result.c = NULL;
- ctx->result.len = 0;
+ retval = estrndup(ctx->result.s->val, ctx->result.s->len);
+ smart_str_free(&ctx->result);
return retval;
}
@@ -987,25 +990,24 @@ static void php_url_scanner_output_handler(char *output, uint output_len, char *
{
size_t len;
- if (BG(url_adapt_state_ex).url_app.len != 0) {
+ if (BG(url_adapt_state_ex).url_app.s->len != 0) {
*handled_output = url_adapt_ext(output, output_len, &len, (zend_bool) (mode & (PHP_OUTPUT_HANDLER_END | PHP_OUTPUT_HANDLER_CONT | PHP_OUTPUT_HANDLER_FLUSH | PHP_OUTPUT_HANDLER_FINAL) ? 1 : 0) TSRMLS_CC);
if (sizeof(uint) < sizeof(size_t)) {
if (len > UINT_MAX)
len = UINT_MAX;
}
*handled_output_len = len;
- } else if (BG(url_adapt_state_ex).url_app.len == 0) {
+ } else if (BG(url_adapt_state_ex).url_app.s->len == 0) {
url_adapt_state_ex_t *ctx = &BG(url_adapt_state_ex);
- if (ctx->buf.len) {
- smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
+ if (ctx->buf.s) {
+ smart_str_appendl(&ctx->result, ctx->buf.s->val, ctx->buf.s->len);
smart_str_appendl(&ctx->result, output, output_len);
- *handled_output = ctx->result.c;
- *handled_output_len = ctx->buf.len + output_len;
+ *handled_output = estrndup(ctx->result.s->val, ctx->result.s->len);
+ *handled_output_len = ctx->buf.s->len + output_len;
- ctx->result.c = NULL;
- ctx->result.len = 0;
smart_str_free(&ctx->buf);
+ smart_str_free(&ctx->result);
} else {
*handled_output = estrndup(output, *handled_output_len = output_len);
}
@@ -1027,7 +1029,7 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
}
- if (BG(url_adapt_state_ex).url_app.len != 0) {
+ if (BG(url_adapt_state_ex).url_app.s->len != 0) {
smart_str_appends(&BG(url_adapt_state_ex).url_app, PG(arg_separator).output);
}
@@ -1056,8 +1058,8 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
PHPAPI int php_url_scanner_reset_vars(TSRMLS_D)
{
- BG(url_adapt_state_ex).form_app.len = 0;
- BG(url_adapt_state_ex).url_app.len = 0;
+ BG(url_adapt_state_ex).form_app.s->len = 0;
+ BG(url_adapt_state_ex).url_app.s->len = 0;
return SUCCESS;
}
@@ -1066,8 +1068,7 @@ PHP_MINIT_FUNCTION(url_scanner)
{
BG(url_adapt_state_ex).tags = NULL;
- BG(url_adapt_state_ex).form_app.c = BG(url_adapt_state_ex).url_app.c = 0;
- BG(url_adapt_state_ex).form_app.len = BG(url_adapt_state_ex).url_app.len = 0;
+ BG(url_adapt_state_ex).form_app.s = BG(url_adapt_state_ex).url_app.s = NULL;
REGISTER_INI_ENTRIES();
return SUCCESS;