[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[Libevent-users] Re: Bug#632490: libevent-dev: namespace polution (#define-s _GNU_SOURCE)



On Sat, Jul 2, 2011 at 3:33 PM, Jonathan Nieder <jrnieder@xxxxxxxxx> wrote:
> Package: libevent-dev
> Version: 2.0.12-stable-1
> Severity: important
> Justification: beanstalkd ftbfs
> Files: /usr/include/event2/util.h
>
> Hi,
>
> Trying to build beanstalkd, I get:
>
> | gcc -DHAVE_CONFIG_H -I.     -g -O2  -Wall -Werror -I/usr/include -c -o tube.o tube.c
> | In file included from /usr/include/event2/event.h:48:0,
> |                  from /usr/include/event.h:192,
> |                  from conn.h:23,
> |                  from prot.h:22,
> |                  from tube.c:25:
> | /usr/include/stdio.h:417:12: error: expected identifier or ‘(’ before ‘void’
> | /usr/include/stdio.h:417:12: error: expected ‘)’ before numeric constant
> | make[2]: *** [tube.o] Error 1
>
> That line in stdio.h defines dprintf(), which is used by beanstalkd
> for a totally unrelated purpose (#define dprintf(x) (void) 0).  So far
> that had not been a problem because until POSIX.1-2008, dprintf was in
> the application namespace and POSIX implementations were not allowed to
> step on that.
>
> Indeed, glibc does not define dprintf unless someone has requested
>
>        #define _XOPEN_SOURCE 700
>
> or "#define _GNU_SOURCE" or similar (see feature_test_macros(7)).
> Unfortunately libevent's util.h defines _GNU_SOURCE, meaning
> applications using it have no reliable guarantees about what function
> names are available for their own use.
>
> Also relevant is that POSIX only guarantees that defining feature test
> macros will work if it's done before the very first #include of a
> system header.  So ideally this would be the application's
> responsibility.
>
> Luckily util.h already has ifdefs to gracefully cope even with systems
> without any netdb.h at all.

Unfortunately, it's not so graceful at all: the #ifdefs define
constants and structures based on the values and layouts associated
with the getaddrinfo() interface.  (At least, if I recall correctly,
that's what Libevent is up to here.)  In other words, the libevent
EAI_X values are the same as the system EAI values... but if the
header sometimes defines its own values (when the user hasn't set
GNU_SOURCE) and sometimes doesn't, there will be a mismatch between
the system values and Libevent's values, and code that doesn't define
the right options will break.

We could say, "Libevent should always use its own evutil_addrinfo, and
its own EVUTIL_EAI codes".  That would break ABI compatibility,
though, and I'd rather wait for 2.1 to do that.

>  I think the best thing to do would be to
> allow the application to define _GNU_SOURCE and take advantage of the
> additional error numbers opportunistically, or maybe even something
> like
>
>        #ifndef _GNU_SOURCE
>        #warning "please define _GNU_SOURCE for full functionality"
>        #endif
>
> There is arguably also a bug in beanstalkd here --- friendly programs
> do not rely on outdated versions of POSIX.  But that's a less
> important bug, so let's deal with this one first. :)

I'd definitely like help working on and testing a patch for Libevent
to fix this. It's not something I can comfortably put into mainline
Libevent the  2.0 (stable) series because of the ABI-breaking issue
and because of the possibility of breaking other code, but I'd love to
see it fixed in 2.1.

> Thanks for reading, and hope that helps.
>
> Regards,
> Jonathan
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.