Fix crash in pcre2test for some callouts with string arguments.

This commit is contained in:
Philip.Hazel 2015-03-14 10:47:43 +00:00
parent baf08a3d37
commit b2c67082bd
5 changed files with 73 additions and 9 deletions

View File

@ -4533,7 +4533,12 @@ callout_function(pcre2_callout_block_8 *cb, void *callout_data_ptr)
uint32_t i, pre_start, post_start, subject_length; uint32_t i, pre_start, post_start, subject_length;
BOOL utf = (FLD(compiled_code, overall_options) & PCRE2_UTF) != 0; BOOL utf = (FLD(compiled_code, overall_options) & PCRE2_UTF) != 0;
BOOL callout_capture = (dat_datctl.control & CTL_CALLOUT_CAPTURE) != 0; BOOL callout_capture = (dat_datctl.control & CTL_CALLOUT_CAPTURE) != 0;
FILE *f = (first_callout || callout_capture)? outfile : NULL;
/* This FILE is used for echoing the subject. This is done only once in simple
cases. */
FILE *f = (first_callout || callout_capture || cb->callout_string != NULL)?
outfile : NULL;
/* For a callout with a string argument, show the string first because there /* For a callout with a string argument, show the string first because there
isn't a tidy way to fit it in the rest of the data. */ isn't a tidy way to fit it in the rest of the data. */
@ -4541,7 +4546,7 @@ isn't a tidy way to fit it in the rest of the data. */
if (cb->callout_string != NULL) if (cb->callout_string != NULL)
{ {
uint32_t delimiter = CODE_UNIT(cb->callout_string, -1); uint32_t delimiter = CODE_UNIT(cb->callout_string, -1);
fprintf(f, "Callout: %c", delimiter); fprintf(outfile, "Callout: %c", delimiter);
PCHARSV(cb->callout_string, 0, PCHARSV(cb->callout_string, 0,
cb->callout_string_length, utf, outfile); cb->callout_string_length, utf, outfile);
for (i = 0; callout_start_delims[i] != 0; i++) for (i = 0; callout_start_delims[i] != 0; i++)
@ -4551,26 +4556,27 @@ if (cb->callout_string != NULL)
break; break;
} }
fprintf(outfile, "%c", delimiter); fprintf(outfile, "%c", delimiter);
if (!callout_capture) fprintf(f, "\n"); if (!callout_capture) fprintf(outfile, "\n");
} }
/* Show captured strings if required */ /* Show captured strings if required */
if (callout_capture) if (callout_capture)
{ {
if (cb->callout_string == NULL) fprintf(f, "Callout %d:", cb->callout_number); if (cb->callout_string == NULL)
fprintf(f, " last capture = %d\n", cb->capture_last); fprintf(outfile, "Callout %d:", cb->callout_number);
fprintf(outfile, " last capture = %d\n", cb->capture_last);
for (i = 0; i < cb->capture_top * 2; i += 2) for (i = 0; i < cb->capture_top * 2; i += 2)
{ {
fprintf(f, "%2d: ", i/2); fprintf(outfile, "%2d: ", i/2);
if (cb->offset_vector[i] == PCRE2_UNSET) if (cb->offset_vector[i] == PCRE2_UNSET)
fprintf(f, "<unset>"); fprintf(outfile, "<unset>");
else else
{ {
PCHARSV(cb->subject, cb->offset_vector[i], PCHARSV(cb->subject, cb->offset_vector[i],
cb->offset_vector[i+1] - cb->offset_vector[i], utf, f); cb->offset_vector[i+1] - cb->offset_vector[i], utf, f);
} }
fprintf(f, "\n"); fprintf(outfile, "\n");
} }
} }
@ -4626,7 +4632,7 @@ fprintf(outfile, "%.*s",
pbuffer8 + cb->pattern_position); pbuffer8 + cb->pattern_position);
fprintf(outfile, "\n"); fprintf(outfile, "\n");
first_callout = 0; first_callout = FALSE;
if (cb->mark != last_callout_mark) if (cb->mark != last_callout_mark)
{ {

6
testdata/testinput2 vendored
View File

@ -4218,4 +4218,10 @@ a random value. /Ix
abcdefg abcdefg
xyz123 xyz123
/^ab(?C'first')cd(?C"second")ef/
abcdefg
/(?:a(?C`code`)){3}X/
aaaXY
# End of testinput2 # End of testinput2

6
testdata/testinput6 vendored
View File

@ -4835,4 +4835,10 @@
abcdefg abcdefg
xyz123 xyz123
/^ab(?C'first')cd(?C"second")ef/
abcdefg
/(?:a(?C`code`)){3}X/
aaaXY
# End of testinput6 # End of testinput6

23
testdata/testoutput2 vendored
View File

@ -14146,4 +14146,27 @@ Callout: $abc$
^ (?=abc) ^ (?=abc)
0: xyz 0: xyz
/^ab(?C'first')cd(?C"second")ef/
abcdefg
Callout: 'first'
--->abcdefg
^ ^ c
Callout: "second"
--->abcdefg
^ ^ e
0: abcdef
/(?:a(?C`code`)){3}X/
aaaXY
Callout: `code`
--->aaaXY
^^ )
Callout: `code`
--->aaaXY
^ ^ )
Callout: `code`
--->aaaXY
^ ^ )
0: aaaX
# End of testinput2 # End of testinput2

23
testdata/testoutput6 vendored
View File

@ -7887,4 +7887,27 @@ Callout: $abc$
^ (?=abc) ^ (?=abc)
0: xyz 0: xyz
/^ab(?C'first')cd(?C"second")ef/
abcdefg
Callout: 'first'
--->abcdefg
^ ^ c
Callout: "second"
--->abcdefg
^ ^ e
0: abcdef
/(?:a(?C`code`)){3}X/
aaaXY
Callout: `code`
--->aaaXY
^^ )
Callout: `code`
--->aaaXY
^ ^ )
Callout: `code`
--->aaaXY
^ ^ )
0: aaaX
# End of testinput6 # End of testinput6