On Fri, 26 Feb 2016, Michael McConville wrote:

> The expression (1 << (c&7)) is used as a boolean in:
> 
> pcre, pcre_study:1374
> pcre2,        src/pcre2_study.c:1455
> 
> This is technically a constant true value, as the only potential
> outcomes are:
> 
>  * no overflow
>  * undefined overflow
> 
> Nonetheless, considering the '&7' part, overflow is impossible.
> 
> Thanks for your time,

Thanks for your report. This is, of course, a typo. In the line

  if ((classmap[c/8] && (1 << (c&7))) != 0) 

"&&" should be "&". I have fixed this in both PCRE1 and PCRE2. By sheer 
luck, this bug did not actually affect anything. I have spent some time 
trying to figure out a way of testing the fix, but I have failed. 
What it might have done is set up unnecessary potential starting bytes 
in UTF-8 mode, but in practice, there are only two possible starting
bytes for characters in the range 128-255, and all the bits in any one 
classmap byte use the same one, so testing all of them (instead of just 
one) does not cause anything to go wrong.

Philip

-- 
Philip Hazel

-- 
## List details at https://lists.exim.org/mailman/listinfo/pcre-dev 

Reply via email to