tech-pkg archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Fix for libnbcompat's asprintf
On Mon, Jun 18, 2012 at 06:46:39AM +0000, David Holland wrote:
> On Sun, Jun 17, 2012 at 04:19:05AM +0200, Joerg Sonnenberger wrote:
> > Hi all,
> > there is an old outstanding bug that libnbcompat's asprintf doesn't work
> > correctly, if the output is longer than 128 Bytes. The attached patch
> > fixes that, as long as either va_copy, __builtin_va_copy or direct
> > (struct) assignmemnt of va_list is supported. Can I get some testing for
> > this, especially on HP-UX which has no asprintf?
>
> Hrm, doesn't the va_copy'd ap have to be va_ended separately?
Corrected patch attached.
Joerg
Index: asprintf.c
===================================================================
RCS file: /home/joerg/repo/netbsd/pkgsrc/pkgtools/libnbcompat/files/asprintf.c,v
retrieving revision 1.2
diff -u -p -r1.2 asprintf.c
--- asprintf.c 20 Jul 2007 00:10:06 -0000 1.2
+++ asprintf.c 18 Jun 2012 12:41:22 -0000
@@ -56,6 +56,7 @@ vasprintf(char **ret, const char *fmt, v
char *buf, *new_buf;
size_t len;
int retval;
+ va_list ap2;
len = 128;
buf = malloc(len);
@@ -64,10 +65,18 @@ vasprintf(char **ret, const char *fmt, v
return -1;
}
+#if defined(HAVE_VA_COPY)
+ va_copy(ap2, ap);
+#elif defined(HAVE___BUILTIN_VA_COPY)
+ __builtin_va_copy(ap2, ap);
+#else
+ ap2 = ap;
+#endif
retval = vsnprintf(buf, len, fmt, ap);
if (retval < 0) {
free(buf);
*ret = NULL;
+ va_end(ap2);
return -1;
}
@@ -77,6 +86,7 @@ vasprintf(char **ret, const char *fmt, v
*ret = buf;
else
*ret = new_buf;
+ va_end(ap2);
return retval;
}
@@ -85,9 +95,11 @@ vasprintf(char **ret, const char *fmt, v
buf = malloc(len);
if (buf == NULL) {
*ret = NULL;
+ va_end(ap2);
return -1;
}
- retval = vsnprintf(buf, len, fmt, ap);
+ retval = vsnprintf(buf, len, fmt, ap2);
+ va_end(ap2);
if (retval != len - 1) {
free(buf);
*ret = NULL;
Index: configure
===================================================================
RCS file: /home/joerg/repo/netbsd/pkgsrc/pkgtools/libnbcompat/files/configure,v
retrieving revision 1.77
diff -u -p -r1.77 configure
--- configure 28 Dec 2011 19:19:31 -0000 1.77
+++ configure 17 Jun 2012 02:15:26 -0000
@@ -4486,6 +4486,98 @@ esac
fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5
+$as_echo_n "checking for va_copy... " >&6; }
+if ${pkg_cv_have_va_copy+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdarg.h>
+
+int
+main ()
+{
+
+ va_list ap, ap2;
+ va_copy(ap2, ap);
+ return 0;
+;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ pkg_cv_have_va_copy=yes
+else
+ pkg_cv_have_va_copy=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkg_cv_have_va_copy" >&5
+$as_echo "$pkg_cv_have_va_copy" >&6; }
+ if test "x$pkg_cv_have_va_copy" = "xyes"; then
+ $as_echo "#define HAVE_VA_COPY 1" >>confdefs.h
+
+
+ else
+ :
+]
+ :
+ fi
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for
__builtin_va_copy" >&5
+$as_echo_n "checking for __builtin_va_copy... " >&6; }
+if ${pkg_cv_have___builtin_va_copy+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdarg.h>
+
+int
+main ()
+{
+
+ va_list ap, ap2;
+ __builtin_va_copy(ap2, ap);
+ return 0;
+;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ pkg_cv_have___builtin_va_copy=yes
+else
+ pkg_cv_have___builtin_va_copy=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
$pkg_cv_have___builtin_va_copy" >&5
+$as_echo "$pkg_cv_have___builtin_va_copy" >&6; }
+ if test "x$pkg_cv_have___builtin_va_copy" = "xyes"; then
+ $as_echo "#define HAVE___BUILTIN_VA_COPY 1" >>confdefs.h
+
+
+ else
+ :
+]
+ :
+ fi
+
+
for ac_header in md5.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "md5.h" "ac_cv_header_md5_h"
"$ac_includes_default"
Index: configure.ac
===================================================================
RCS file:
/home/joerg/repo/netbsd/pkgsrc/pkgtools/libnbcompat/files/configure.ac,v
retrieving revision 1.78
diff -u -p -r1.78 configure.ac
--- configure.ac 28 Dec 2011 19:19:31 -0000 1.78
+++ configure.ac 17 Jun 2012 02:15:22 -0000
@@ -78,6 +78,30 @@ AC_CHECK_FUNC(regexec, [:], [
AC_LIBOBJ(regfree)
])
+AC_MSG_TRY_LINK([for va_copy], pkg_cv_have_va_copy, [
+#include <stdarg.h>
+], [
+ va_list ap, ap2;
+ va_copy(ap2, ap);
+ return 0;
+], AC_DEFINE(HAVE_VA_COPY)
+ AH_TEMPLATE([HAVE_VA_COPY], [
+ Define to 1 if the `va_copy' function is supported.
+ ]), [:]
+])
+
+AC_MSG_TRY_LINK([for __builtin_va_copy], pkg_cv_have___builtin_va_copy, [
+#include <stdarg.h>
+], [
+ va_list ap, ap2;
+ __builtin_va_copy(ap2, ap);
+ return 0;
+], AC_DEFINE(HAVE___BUILTIN_VA_COPY)
+ AH_TEMPLATE([HAVE___BUILTIN_VA_COPY], [
+ Define to 1 if the `__builtin_va_copy' function is supported.
+ ]), [:]
+])
+
AC_CHECK_HEADERS([md5.h], [
AC_MSG_TRY_COMPILE([for MD5Init in md5.h], pkg_cv_have_md5init, [
#include <sys/types.h>
Index: nbcompat/config.h.in
===================================================================
RCS file:
/home/joerg/repo/netbsd/pkgsrc/pkgtools/libnbcompat/files/nbcompat/config.h.in,v
retrieving revision 1.29
diff -u -p -r1.29 config.h.in
--- nbcompat/config.h.in 20 Apr 2010 00:32:23 -0000 1.29
+++ nbcompat/config.h.in 17 Jun 2012 02:09:59 -0000
@@ -508,6 +508,9 @@
/* Define to 1 if you have the <utime.h> header file. */
#undef HAVE_UTIME_H
+/* Define to 1 if the `va_copy' function is supported. */
+#undef HAVE_VA_COPY
+
/* Define to 1 if you have the `vfork' function. */
#undef HAVE_VFORK
@@ -541,6 +544,9 @@
/* define if your compiler has __attribute__ */
#undef HAVE___ATTRIBUTE__
+/* Define to 1 if the `__builtin_va_copy' function is supported. */
+#undef HAVE___BUILTIN_VA_COPY
+
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
Home |
Main Index |
Thread Index |
Old Index