Hi, po...@! This patch fixes core dump of gapcmon, when using hostname (from Vadim Zhukov). Switch to REVISION and new-style LIB_DEPENDS/WANTLIB while here. Use with patch -E. Tested on amd64. OK?
Upstream doesn't like these patches from Vadim Zhukov: http://sourceforge.net/mailarchive/message.php?msg_name=7cb80a7b981d4ff106065fe2c4548857.squirrel%40mail.linklevel.net http://sourceforge.net/mailarchive/message.php?msg_name=EAFBC888C66E4C1ABF832ED0F3564483%40pia http://sourceforge.net/mailarchive/forum.php?thread_name=fe54fa2547770cb79493e0a5fc3417cc.squirrel%40mail.linklevel.net&forum_name=apcupsd-users Index: Makefile =================================================================== RCS file: /cvs/ports/sysutils/apcupsd/Makefile,v retrieving revision 1.3 diff -u -p -r1.3 Makefile --- Makefile 17 Jun 2010 18:43:43 -0000 1.3 +++ Makefile 4 Oct 2010 17:50:35 -0000 @@ -5,9 +5,11 @@ COMMENT-cgi = CGI scripts for web monit COMMENT-x11 = gapcmon - GUI for apcupsd DISTNAME = apcupsd-3.14.8 -PKGNAME-main = ${DISTNAME}p1 +PKGNAME-main = ${DISTNAME} +REVISION-main = 2 PKGNAME-cgi = ${DISTNAME:S/-/-cgi-/} -PKGNAME-x11 = ${DISTNAME:S/-/-x11-/}p0 +PKGNAME-x11 = ${DISTNAME:S/-/-x11-/} +REVISION-x11 = 1 CATEGORIES = sysutils @@ -53,23 +55,22 @@ MULTI_PACKAGES = -main MULTI_PACKAGES += -cgi PREFIX-cgi = ${WEB_ROOT} CONFIGURE_ARGS += --enable-cgi -LIB_DEPENDS-cgi = gd::graphics/gd +WANTLIB-cgi = ${WANTLIB} gd +LIB_DEPENDS-cgi = ::graphics/gd RUN_DEPENDS-cgi = .if !${FLAVOR:L:Mno_x11} MULTI_PACKAGES += -x11 USE_X11 = Yes CONFIGURE_ARGS += --enable-gapcmon -LIB_DEPENDS-x11 = atk-1.0.>=2009::devel/atk \ - cairo.>=7::graphics/cairo \ - gconf-2.>=6::devel/gconf2 \ +LIB_DEPENDS-x11 = ::devel/gconf2 \ ${MODGETTEXT_LIB_DEPENDS} RUN_DEPENDS-x11 = :desktop-file-utils-*:devel/desktop-file-utils \ ${MODGETTEXT_RUN_DEPENDS} -WANTLIB-x11 += ORBit-2 X11 Xau Xcomposite Xcursor Xdamage Xdmcp Xext -WANTLIB-x11 += Xfixes Xi Xinerama Xrandr Xrender dbus-1 expat fontconfig -WANTLIB-x11 += freetype gdk-x11-2.0 gdk_pixbuf-2.0 gio-2.0 glib-2.0 +WANTLIB-x11 += ORBit-2 X11 Xau Xcomposite Xcursor Xdamage Xdmcp Xext Xfixes +WANTLIB-x11 += Xi Xinerama Xrandr Xrender atk-1.0 cairo expat fontconfig +WANTLIB-x11 += freetype gconf-2 gdk-x11-2.0 gdk_pixbuf-2.0 gio-2.0 glib-2.0 WANTLIB-x11 += glitz gmodule-2.0 gobject-2.0 gthread-2.0 gtk-x11-2.0 WANTLIB-x11 += m pango-1.0 pangocairo-1.0 pangoft2-1.0 pixman-1 png WANTLIB-x11 += pthread-stubs xcb xcb-render xcb-render-util z ${WANTLIB} @@ -77,8 +78,8 @@ WANTLIB-x11 += pthread-stubs xcb xcb-ren .if ${FLAVOR:L:Msnmp} CONFIGURE_ARGS += --enable-net-snmp -LIB_DEPENDS-main += netsnmp::net/net-snmp -WANTLIB-main = ${WANTLIB} crypto +LIB_DEPENDS-main += ::net/net-snmp +WANTLIB-main = ${WANTLIB} crypto netsnmp .endif FAKE_FLAGS = sysconfdir=${TRUEPREFIX}/share/examples/apcupsd/etc Index: patches/patch-src_gapcmon_gapcmon_c =================================================================== RCS file: patches/patch-src_gapcmon_gapcmon_c diff -N patches/patch-src_gapcmon_gapcmon_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_gapcmon_gapcmon_c 4 Oct 2010 17:50:35 -0000 @@ -0,0 +1,68 @@ +$OpenBSD$ +--- src/gapcmon/gapcmon.c.orig Tue Sep 16 08:58:20 2008 ++++ src/gapcmon/gapcmon.c Sat Jul 3 03:11:35 2010 +@@ -79,6 +79,7 @@ + #include <netinet/in.h> /* sockaddr_in */ + #include <netdb.h> /* gethostbyname() */ + #include <errno.h> ++#include <pthread.h> + #include <string.h> /* memset() */ + #include <time.h> + #include <stdlib.h> /* malloc() */ +@@ -171,8 +172,10 @@ static gint gapc_panel_graph_property_page(PGAPC_CONFI + * Common interface to the various versions of gethostbyname_r(). + * Implemented in gethostname.c. + */ +-struct hostent * gethostname_re +- (const char *host,struct hostent *hostbuf,char **tmphstbuf,size_t *hstbuflen); ++int gethostname_re (const char *, struct hostent *); ++#ifdef HAVE_FUNC_GETHOSTBYNAME_R_0 ++extern pthread_mutex_t ghn_mutex; ++#endif + + /* + * Some small number of globals are required +@@ -2504,14 +2507,10 @@ static GIOChannel *sknet_net_open (PSKCOMM psk) + nrc = inet_aton (psk->ch_ip_string, (struct in_addr *)&tcp_serv_addr->sin_addr.s_addr); + if ( nrc == 0) /* inet_aton failed */ + { +- struct hostent he, *phe; +- char *buff; +- size_t bufflen = 0; ++ struct hostent he; + +- phe = gethostname_re(psk->ch_ip_string, &he, &buff, &bufflen); +- if (phe == NULL) ++ if (gethostname_re(psk->ch_ip_string, &he) == -1) + { +- free(buff); + sknet_util_log_msg ("sknet_net_open", "gethostbyname() failed", ""); + g_snprintf(psk->ch_error_msg, sizeof(psk->ch_error_msg), "gethostbyname() failed"); + psk->ioc = NULL; +@@ -2519,7 +2518,6 @@ static GIOChannel *sknet_net_open (PSKCOMM psk) + } + if (he.h_length != sizeof (struct in_addr) || he.h_addrtype != AF_INET) + { +- free(buff); + sknet_util_log_msg ("sknet_net_open", "struct hostent", "argument error"); + g_snprintf(psk->ch_error_msg, sizeof(psk->ch_error_msg),"%s","argument error"); + psk->ioc = NULL; +@@ -2527,7 +2525,6 @@ static GIOChannel *sknet_net_open (PSKCOMM psk) + } + + tcp_serv_addr->sin_addr.s_addr = *(unsigned int *) he.h_addr; +- free(buff); + } /* end if inet_addr */ + + } /* end if b_network */ +@@ -6431,6 +6428,10 @@ extern int main(int argc, char *argv[]) + * enter the GTK main loop + */ + gdk_threads_enter(); ++#ifdef HAVE_FUNC_GETHOSTBYNAME_R_0 ++ pthread_mutex_init(&ghn_mutex, NULL); ++#endif ++ + gtk_main(); + gdk_flush(); + gdk_threads_leave(); Index: patches/patch-src_gapcmon_gethostname_c =================================================================== RCS file: patches/patch-src_gapcmon_gethostname_c diff -N patches/patch-src_gapcmon_gethostname_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_gapcmon_gethostname_c 4 Oct 2010 17:50:35 -0000 @@ -0,0 +1,152 @@ +$OpenBSD$ +--- src/gapcmon/gethostname.c.orig Tue Jan 29 05:14:57 2008 ++++ src/gapcmon/gethostname.c Sun Jul 11 20:55:21 2010 +@@ -1,81 +1,89 @@ + #include <netdb.h> + #include <errno.h> + #include <stdlib.h> ++#include <string.h> + +-#ifdef HAVE_FUNC_GETHOSTBYNAME_R_6 +-struct hostent * gethostname_re (const char *host,struct hostent *hostbuf,char **tmphstbuf,size_t *hstbuflen) ++#if defined(HAVE_FUNC_GETHOSTBYNAME_R_6) || defined(HAVE_FUNC_GETHOSTBYNAME_R_5) ++int gethostname_re (const char *host, struct hostent *hostbuf); + { +- struct hostent *hp; +- int herr,res; ++ struct hostent *hp; ++ size_t hstbuflen; ++ int herr, oerrno, res; ++ char *tmphstbuf, *ntmphstbuf; + +- if (*hstbuflen == 0) +- { +- *hstbuflen = 1024; +- *tmphstbuf = (char *)malloc (*hstbuflen); +- } ++ res = 0; ++ hstbuflen = 1024; ++ tmphstbuf = calloc(hstbuflen, 1); ++ if (tmphstbuf == NULL) ++ return -1; + +- while (( res = +- gethostbyname_r(host,hostbuf,*tmphstbuf,*hstbuflen,&hp,&herr)) +- && (errno == ERANGE)) ++#ifdef HAVE_FUNC_GETHOSTBYNAME_R_6 ++ while ((res = gethostbyname_r(host, hostbuf, tmphstbuf, ++ hstbuflen, &hp, &herr)) && errno == ERANGE) ++#else /* HAVE_FUNC_GETHOSTBYNAME_R_5 */ ++ while ((NULL == (hp = gethostbyname_r(host, hostbuf, tmphstbuf, ++ hstbuflen, &herr))) && errno == ERANGE) ++#endif + { + /* Enlarge the buffer. */ +- *hstbuflen *= 2; +- *tmphstbuf = (char *)realloc (*tmphstbuf,*hstbuflen); +- } +- if (res) +- return NULL; +- return hp; +-} ++ ntmphstbuf = realloc(tmphstbuf, hstbuflen * 2); ++ if (ntmphstbuf == NULL) { ++#ifdef HAVE_FUNC_GETHOSTBYNAME_R_6 ++ res = -1; + #endif +-#ifdef HAVE_FUNC_GETHOSTBYNAME_R_5 +-struct hostent * gethostname_re (const char *host,struct hostent *hostbuf,char **tmphstbuf,size_t *hstbuflen) +-{ +- struct hostent *hp; +- int herr; +- +- if (*hstbuflen == 0) +- { +- *hstbuflen = 1024; +- *tmphstbuf = (char *)malloc (*hstbuflen); ++ break; ++ } ++ memset(ntmphstbuf + hstbuflen, 0, hstbuflen); ++ hstbuflen *= 2; ++ tmphstbuf = ntmphstbuf; + } + +- while ((NULL == ( hp = +- gethostbyname_r(host,hostbuf,*tmphstbuf,*hstbuflen,&herr))) +- && (errno == ERANGE)) +- { +- /* Enlarge the buffer. */ +- *hstbuflen *= 2; +- *tmphstbuf = (char *)realloc (*tmphstbuf,*hstbuflen); +- } +- return hp; +-} ++#ifdef HAVE_FUNC_GETHOSTBYNAME_R_5 ++ if (hp == NULL) ++ res = -1; + #endif ++ if (!res) ++ memcpy(hostbuf, hp, sizeof(struct hostent)); ++ oerrno = errno; ++ free(tmphstbuf); ++ errno = oerrno; ++ return res; ++} ++#endif /* defined(HAVE_FUNC_GETHOSTBYNAME_R_6) || defined(HAVE_FUNC_GETHOSTBYNAME_R_5) */ ++ + #ifdef HAVE_FUNC_GETHOSTBYNAME_R_3 +-struct hostent * gethostname_re (const char *host,struct hostent *hostbuf,char **tmphstbuf,size_t *hstbuflen) ++int gethostname_re (const char *host, struct hostent *hostbuf) + { +- if (*hstbuflen == 0) +- { +- *hstbuflen = sizeof(struct hostent_data); +- *tmphstbuf = (char *)malloc (*hstbuflen); +- } +- else if (*hstbuflen < sizeof(struct hostent_data)) +- { +- *hstbuflen = sizeof(struct hostent_data); +- *tmphstbuf = (char *)realloc(*tmphstbuf, *hstbuflen); +- } +- memset((void *)(*tmphstbuf),0,*hstbuflen); ++ struct hostent_data hed; + +- if (0 != gethostbyname_r(host,hostbuf,(struct hostent_data *)*tmphstbuf)) +- return NULL; +- return hostbuf; ++ memset(hed, 0, sizeof(struct hostent_data)); ++ return gethostbyname_r(host, hostbuf, &hed); + } + #endif + #ifdef HAVE_FUNC_GETHOSTBYNAME_R_0 +-#warning WARNING! Your system does not have a thread-safe DNS resolver (gethostbyname_r)! +-#warning WARNING! Name service lookups may be corrupted. Consider switching to +-#warning WARNING! a more thread-friendly platform. +-struct hostent * gethostname_re (const char *host,struct hostent *hostbuf,char **tmphstbuf,size_t *hstbuflen) ++#include <pthread.h> ++ ++pthread_mutex_t ghn_mutex; ++ ++int gethostname_re (const char *name, struct hostent *hostbuf) + { +- return gethostbyname(host); ++ struct hostent *he; ++ int rv; ++ ++ /* play safe */ ++ rv = 0; ++ memset(hostbuf, 0, sizeof(struct hostent)); ++ ++ pthread_mutex_lock(&ghn_mutex); ++ he = gethostbyname(name); ++ if (he == NULL) { ++ rv = -1; ++ goto end; ++ } ++ memcpy(hostbuf, he, sizeof(struct hostent)); ++ ++end: ++ pthread_mutex_unlock(&ghn_mutex); ++ return rv; + } + #endif
apcupsd.diff
Description: Binary data