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
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list