
On 09/04/2013 02:03 PM, Jim Fehlig wrote:
Yeah, good question. I found a few occurrences of regcomp() and friends throughout the sources and most seem to do regfree() even when regcomp() fails. The man page is not very clear, but the notes on regfree() suggest it is not necessary
POSIX Pattern Buffer Freeing Supplying regfree() with a precompiled pattern buffer, preg will free the memory allocated to the pattern buffer by the compiling process, regcomp().
But does the pattern buffer contain any allocated memory when regcomp() fails? The notes on regcomp() are not clear about this.
Thankfully, we can read the source :) In glibc, regcomp assigns into preg, but is careful to undo any allocation on failure; it is also careful to make regfree() a no-op on an already-freed buffer (whether by calling regfree() twice in a row, or using it on preg after a failed regcomp). Gnulib copies this behavior. But it is not universally standard:
The System Interfaces volume of POSIX.1-2008 [1] says this about regcomp() return value
Upon successful completion, the regcomp() function shall return 0. Otherwise, it shall return an integer value indicating an error as described in /<regex.h>/ <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/regex.h.html>, and the content of preg is undefined. If a code is returned, the interpretation shall be as given in /<regex.h>/ <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/regex.h.html>.
I don't think we want to call regfree() on an undefined preg right?
Correct - regfree() is only needed on successful regcomp(). We can probably get away with calling regfree() even on failure because we use gnulib, but that's not a good reason, so it wouldn't hurt to audit the code and guarantee a free only on success. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org