[Haskell-cafe] is this a bug ?

Daniel Fischer daniel.is.fischer at web.de
Sat Jul 17 11:10:37 EDT 2010


On Saturday 17 July 2010 05:39:00, gate03 at landcroft.co.uk wrote:
> On Sat 17/07/10 04:17 , Alexander Solla ajs at 2piix.com sent:
> > Why are you performing unsafe IO actions?  They don't play nice
> > with laziness.
>
> OK, fair cop, but without the unsafe IO action, it still misbehaves.
>
> http://hpaste.org/fastcgi/hpaste.fcgi/view?id=27650
>
> Michael.

Source-diving reveals: it's a bug.
Text.Regex.Posix.ByteString.Lazy is just a thin wrapper around the strict 
variant, lazy ByteStrings are transformed into strict ones before the 
functions of Text.Regex.Posix.ByteString are called.
To avoid copying twice, if the lazy ByteString does not end with a '\0', a 
'\0' is snoc'ed to the end before transforming to a strict ByteString.
Thus the regexec of Text.Regex.Posix.ByteString takes slices of a longer 
ByteString than it should and no measures are taken to chop the trailing 
'\0' off again.

A related problem is that ByteStrings (and Strings) may legitimately 
contain '\0's, but regex-posix (and probably [almost] all other regex 
packages) treats them as CStrings, so the regex functions will stop 
processing at the first '\0' (naturally, they call C) but on the Haskell 
side, that may be only a small part of the string.



More information about the Haskell-Cafe mailing list