From: nnposter Date: Thu, 9 Aug 2018 21:45:08 +0000 (-0600) Subject: Fixing va_start/va_end usage X-Git-Tag: libpcap-1.10-bp~875^2 X-Git-Url: https://git.tcpdump.org/libpcap/commitdiff_plain/6f0f88f369b7f62b3055e4d947c973325809f6cd?hp=-c Fixing va_start/va_end usage Per ISO/IEC 9899:201x and POSIX: As the functions vfprintf, vfscanf, vprintf, vscanf, vsnprintf, vsprintf, and vsscanf invoke the va_arg macro, the value of [args] after the return is indeterminate. What needs to be done instead is to wrap each invocation of pcap*snprintf with its own pair of va_start and va_end. --- 6f0f88f369b7f62b3055e4d947c973325809f6cd diff --git a/missing/snprintf.c b/missing/snprintf.c index 99f0bdfc..ef206500 100644 --- a/missing/snprintf.c +++ b/missing/snprintf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995-1999 Kungliga Tekniska Högskolan + * Copyright (c) 1995-1999 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -525,6 +525,7 @@ pcap_asnprintf (char **ret, size_t max_sz, const char *format, ...) va_start(args, format); val = pcap_vasnprintf (ret, max_sz, format, args); + va_end(args); #ifdef PARANOIA { @@ -534,14 +535,15 @@ pcap_asnprintf (char **ret, size_t max_sz, const char *format, ...) if (tmp == NULL) abort (); + va_start(args, format); ret2 = pcap_vsprintf (tmp, format, args); + va_end(args); if (val != ret2 || strcmp(*ret, tmp)) abort (); free (tmp); } #endif - va_end(args); return val; } #endif