[Mesa-dev] [PATCH 08/12] glcpp: Use strpbrk in the line continuations pass
Vladislav Egorov
vegorov180 at gmail.com
Sun Jan 8 02:30:15 UTC 2017
Well, running radamsa fuzzer right now and it's able to find quite a bit
of various problems (difference in output/error reporting against
master) in the hand-written parser without any effort. Some cases should
be added to the test-suite maybe.
Clearly the patch series requires more work, sadly. Will try other
fuzzers as well.
08.01.2017 00:56, Vladislav Egorov пишет:
> Oh. Thanks! This is embarrassing. I have no idea how did I manage to
> miss it. Line continuations are so rare that only two games in my
> shader-db use them -- Talos Principle and Serious Sam (both use
> Serious Engine). And neither of them hit this condition. I probably
> need to fuzz this thing or something.
>
> I'll send fixup.
>
> 07.01.2017 22:53, Gustaw Smolarczyk пишет:
>> 7 sty 2017 20:04 "Vladislav Egorov" <vegorov180 at gmail.com> napisał(a):
>>
>> To find newlines the line continuations removal pass uses strchr()
>> twice -- first time to find '\n', second time to find '\r'. Now,
>> if the shader uses Unix line separators '\n', the file could contain
>> no '\r' at all, so each time it will scan to the end of the shader.
>> Use strpbrk() standard function instead that was specifically created
>> to search many characters at once.
>> ---
>> src/compiler/glsl/glcpp/pp.c | 28 ++++++++--------------------
>> 1 file changed, 8 insertions(+), 20 deletions(-)
>>
>> diff --git a/src/compiler/glsl/glcpp/pp.c
>> b/src/compiler/glsl/glcpp/pp.c
>> index c196868..c4c0196 100644
>> --- a/src/compiler/glsl/glcpp/pp.c
>> +++ b/src/compiler/glsl/glcpp/pp.c
>> @@ -231,7 +231,6 @@ remove_line_continuations(glcpp_parser_t
>> *ctx, const char *shader)
>> {
>> struct string_buffer sb;
>> const char *backslash, *newline, *search_start;
>> - const char *cr, *lf;
>> char newline_separator[3];
>> int collapsed_newlines = 0;
>> int separator_len;
>> @@ -266,23 +265,19 @@ remove_line_continuations(glcpp_parser_t
>> *ctx, const char *shader)
>> * examining the first encountered newline terminator,
>> and using the
>> * same terminator for any newlines we insert.
>> */
>> - cr = strchr(search_start, '\r');
>> - lf = strchr(search_start, '\n');
>> + newline = strpbrk(search_start, "\r\n");
>>
>> newline_separator[0] = '\n';
>> newline_separator[1] = '\0';
>> newline_separator[2] = '\0';
>>
>> - if (cr == NULL) {
>> + if (newline == NULL) {
>> /* Nothing to do. */
>> - } else if (lf == NULL) {
>> - newline_separator[0] = '\r';
>> - } else if (lf == cr + 1) {
>> - newline_separator[0] = '\r';
>> - newline_separator[1] = '\n';
>> - } else if (cr == lf + 1) {
>> - newline_separator[0] = '\n';
>> - newline_separator[1] = '\r';
>> + } else if (newline[1] == '\n' || newline[1] == '\r') {
>>
>> What if we have \n\n ? Won't it match it as a single newline?
>>
>> Regards,
>> Gustaw
>
More information about the mesa-dev
mailing list