re_intuit_start(): swap BmUSEFUL + stclass blocks
authorDavid Mitchell <davem@iabyn.com>
Tue, 18 Feb 2014 10:13:54 +0000 (10:13 +0000)
committerDavid Mitchell <davem@iabyn.com>
Sun, 16 Mar 2014 18:03:50 +0000 (18:03 +0000)
commitffad1e6aac9969035a0dd84ca2ac1e4482364b5f
tree3358510d6a96285a5c25b1bc9a2aff4e5d11c235
parent97136c8a5affa3c46e244cc603af319eafb3938b
re_intuit_start(): swap BmUSEFUL + stclass blocks

Currently the code that does BmUSEFUL()--, and which and frees the
substring if the count reaches zero, comes before the stclass code. This
is problematic, because by the time the stclass code is executed, the
check substrings may have been freed. The stclass code does have some
checks for this, but they are inadequate: I managed to produce code that
segfaulted. It's also hard to test - you have to run against the same
pattern 100 times to get the BmUSEFUL() count down to zero, then on the
101st attempt, do something that both triggers the decrement/free and
fails the st class.

By moving the BmUSEFUL()-- stuff to *after* the stclass code, it removes
this issue completely.

As to how it affects the BmUSEFUL() count: I think it makes it slightly
better. Before, a substring could match at rx_origin offset 0, triggering
BmUSEFUL()--, then the stclass could fail, triggering a new substring
match at at a non-zero offset, and thus doing BmUSEFUL()++. The overall
affect being neutral. Now, the overall effect is BmUSEFUL += 1, which
better reflects the fact that the substring *did* help us find a non-zero
offset.
regexec.c