Christian Weisgerber: > You may notice that the other functions that allocate a variable > va_list args and take its address compile just fine. Apparently a > va_list parameter isn't exactly the same thing as a va_list variable, > but it must be possible to va_copy() a parameter to a variable, so > I propose the diff below.
Or we can just do what the trio upstream did ... https://sourceforge.net/p/ctrio/git/ci/acc21f6fea12d32d2f5790b05e8aa000423106a2/ ... and drop this questionable passing of a pointer to a va_list in favor of a plain va_list: --- mail/hypermail/Makefile +++ mail/hypermail/Makefile @@ -3,8 +3,9 @@ COMMENT= generate a cross-referenced HTML mail archiv VERSION= 2.3.0 DISTNAME= hypermail-${VERSION} CATEGORIES= mail www +REVISION= 0 -HOMEPAGE= http://www.hypermail-project.org/ +HOMEPAGE= https://www.hypermail-project.org/ SITES= ${HOMEPAGE} WRKDIST= ${WRKDIR}/hypermail commit - 6b40a864ff5cd7eb048177f2aa76c5686415ede4 blob - /dev/null file + mail/hypermail/patches/patch-src_trio_c (mode 644) --- /dev/null +++ mail/hypermail/patches/patch-src_trio_c @@ -0,0 +1,618 @@ +Remade workaround for uninitialized va_list +https://sourceforge.net/p/ctrio/git/ci/acc21f6fea12d32d2f5790b05e8aa000423106a2/ + +Index: src/trio.c +--- src/trio.c.orig ++++ src/trio.c +@@ -1148,7 +1148,7 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + int type, + TRIO_CONST char *format, + trio_parameter_t *parameters, +- va_list *arglist, ++ va_list arglist, + trio_pointer_t *argarray) + { + /* Count the number of times a parameter is referenced */ +@@ -1183,9 +1183,6 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + int num; + char *tmpformat; + +- /* One and only one of arglist and argarray must be used */ +- assert((arglist != NULL) ^ (argarray != NULL)); +- + /* + * The 'parameters' array is not initialized, but we need to + * know which entries we have used. +@@ -1925,14 +1922,14 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + if (flags & FLAGS_WIDECHAR) + { + parameters[i].data.wstring = (argarray == NULL) +- ? va_arg(*arglist, trio_wchar_t *) ++ ? va_arg(arglist, trio_wchar_t *) + : (trio_wchar_t *)(argarray[num]); + } + else + #endif + { + parameters[i].data.string = (argarray == NULL) +- ? va_arg(*arglist, char *) ++ ? va_arg(arglist, char *) + : (char *)(argarray[num]); + } + break; +@@ -1944,7 +1941,7 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + case FORMAT_COUNT: + case FORMAT_UNKNOWN: + parameters[i].data.pointer = (argarray == NULL) +- ? va_arg(*arglist, trio_pointer_t ) ++ ? va_arg(arglist, trio_pointer_t ) + : argarray[num]; + break; + +@@ -1954,7 +1951,7 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + { + if (argarray == NULL) + parameters[i].data.pointer = +- (trio_pointer_t)va_arg(*arglist, trio_pointer_t); ++ (trio_pointer_t)va_arg(arglist, trio_pointer_t); + else + { + if (parameters[i].type == FORMAT_CHAR) +@@ -2012,36 +2009,36 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + #if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) + if (parameters[i].flags & FLAGS_SIZE_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) +- ? (trio_uintmax_t)va_arg(*arglist, size_t) ++ ? (trio_uintmax_t)va_arg(arglist, size_t) + : (trio_uintmax_t)(*((size_t *)argarray[num])); + else + #endif + #if defined(QUALIFIER_PTRDIFF_T) + if (parameters[i].flags & FLAGS_PTRDIFF_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) +- ? (trio_uintmax_t)va_arg(*arglist, ptrdiff_t) ++ ? (trio_uintmax_t)va_arg(arglist, ptrdiff_t) + : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num])); + else + #endif + #if defined(QUALIFIER_INTMAX_T) + if (parameters[i].flags & FLAGS_INTMAX_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) +- ? (trio_uintmax_t)va_arg(*arglist, trio_intmax_t) ++ ? (trio_uintmax_t)va_arg(arglist, trio_intmax_t) + : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num])); + else + #endif + if (parameters[i].flags & FLAGS_QUAD) + parameters[i].data.number.as_unsigned = (argarray == NULL) +- ? (trio_uintmax_t)va_arg(*arglist, trio_ulonglong_t) ++ ? (trio_uintmax_t)va_arg(arglist, trio_ulonglong_t) + : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num])); + else if (parameters[i].flags & FLAGS_LONG) + parameters[i].data.number.as_unsigned = (argarray == NULL) +- ? (trio_uintmax_t)va_arg(*arglist, long) ++ ? (trio_uintmax_t)va_arg(arglist, long) + : (trio_uintmax_t)(*((long *)argarray[num])); + else + { + if (argarray == NULL) +- parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(*arglist, int); ++ parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(arglist, int); + else + { + if (parameters[i].type == FORMAT_CHAR) +@@ -2062,11 +2059,11 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + */ + if (parameters[i].flags & FLAGS_USER_DEFINED) + parameters[i].data.pointer = (argarray == NULL) +- ? va_arg(*arglist, trio_pointer_t ) ++ ? va_arg(arglist, trio_pointer_t ) + : argarray[num]; + else + parameters[i].data.number.as_unsigned = (argarray == NULL) +- ? (trio_uintmax_t)va_arg(*arglist, int) ++ ? (trio_uintmax_t)va_arg(arglist, int) + : (trio_uintmax_t)(*((int *)argarray[num])); + break; + +@@ -2075,17 +2072,17 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + { + if (parameters[i].flags & FLAGS_LONGDOUBLE) + parameters[i].data.longdoublePointer = (argarray == NULL) +- ? va_arg(*arglist, trio_long_double_t *) ++ ? va_arg(arglist, trio_long_double_t *) + : (trio_long_double_t *)argarray[num]; + else + { + if (parameters[i].flags & FLAGS_LONG) + parameters[i].data.doublePointer = (argarray == NULL) +- ? va_arg(*arglist, double *) ++ ? va_arg(arglist, double *) + : (double *)argarray[num]; + else + parameters[i].data.doublePointer = (argarray == NULL) +- ? (double *)va_arg(*arglist, float *) ++ ? (double *)va_arg(arglist, float *) + : (double *)((float *)argarray[num]); + } + } +@@ -2093,13 +2090,13 @@ TRIO_ARGS5((type, format, parameters, arglist, argarra + { + if (parameters[i].flags & FLAGS_LONGDOUBLE) + parameters[i].data.longdoubleNumber = (argarray == NULL) +- ? va_arg(*arglist, trio_long_double_t) ++ ? va_arg(arglist, trio_long_double_t) + : (trio_long_double_t)(*((trio_long_double_t *)argarray[num])); + else + { + if (argarray == NULL) + parameters[i].data.longdoubleNumber = +- (trio_long_double_t)va_arg(*arglist, double); ++ (trio_long_double_t)va_arg(arglist, double); + else + { + if (parameters[i].flags & FLAGS_SHORT) +@@ -3301,7 +3298,7 @@ TrioFormatRef + TRIO_ARGS4((reference, format, arglist, argarray), + trio_reference_t *reference, + TRIO_CONST char *format, +- va_list *arglist, ++ va_list arglist, + trio_pointer_t *argarray) + { + int status; +@@ -3329,7 +3326,7 @@ TRIO_ARGS6((destination, destinationSize, OutStream, f + size_t destinationSize, + void (*OutStream) TRIO_PROTO((trio_class_t *, int)), + TRIO_CONST char *format, +- va_list *arglist, ++ va_list arglist, + trio_pointer_t *argarray) + { + int status; +@@ -3555,7 +3552,7 @@ TRIO_VARGS2((format, va_alist), + assert(VALID(format)); + + TRIO_VA_START(args, format); +- status = TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); ++ status = TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -3575,7 +3572,7 @@ TRIO_ARGS2((format, args), + { + assert(VALID(format)); + +- return TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); ++ return TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL); + } + + /** +@@ -3591,9 +3588,11 @@ TRIO_ARGS2((format, args), + TRIO_CONST char *format, + trio_pointer_t * args) + { ++ static va_list unused; ++ + assert(VALID(format)); + +- return TrioFormat(stdout, 0, TrioOutStreamFile, format, NULL, args); ++ return TrioFormat(stdout, 0, TrioOutStreamFile, format, unused, args); + } + + /************************************************************************* +@@ -3622,7 +3621,7 @@ TRIO_VARGS3((file, format, va_alist), + assert(VALID(format)); + + TRIO_VA_START(args, format); +- status = TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); ++ status = TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -3645,7 +3644,7 @@ TRIO_ARGS3((file, format, args), + assert(VALID(file)); + assert(VALID(format)); + +- return TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); ++ return TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL); + } + + /** +@@ -3663,10 +3662,12 @@ TRIO_ARGS3((file, format, args), + TRIO_CONST char *format, + trio_pointer_t * args) + { ++ static va_list unused; ++ + assert(VALID(file)); + assert(VALID(format)); + +- return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args); ++ return TrioFormat(file, 0, TrioOutStreamFile, format, unused, args); + } + + /************************************************************************* +@@ -3694,7 +3695,7 @@ TRIO_VARGS3((fd, format, va_alist), + assert(VALID(format)); + + TRIO_VA_START(args, format); +- status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); ++ status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -3716,7 +3717,7 @@ TRIO_ARGS3((fd, format, args), + { + assert(VALID(format)); + +- return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); ++ return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL); + } + + /** +@@ -3734,9 +3735,11 @@ TRIO_ARGS3((fd, format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; ++ + assert(VALID(format)); + +- return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args); ++ return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, unused, args); + } + + /************************************************************************* +@@ -3760,7 +3763,7 @@ TRIO_VARGS4((stream, closure, format, va_alist), + TRIO_VA_START(args, format); + data.stream.out = stream; + data.closure = closure; +- status = TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); ++ status = TrioFormat(&data, 0, TrioOutStreamCustom, format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -3780,7 +3783,7 @@ TRIO_ARGS4((stream, closure, format, args), + + data.stream.out = stream; + data.closure = closure; +- return TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); ++ return TrioFormat(&data, 0, TrioOutStreamCustom, format, args, NULL); + } + + TRIO_PUBLIC int +@@ -3791,6 +3794,7 @@ TRIO_ARGS4((stream, closure, format, args), + TRIO_CONST char *format, + void **args) + { ++ static va_list unused; + trio_custom_t data; + + assert(VALID(stream)); +@@ -3798,7 +3802,7 @@ TRIO_ARGS4((stream, closure, format, args), + + data.stream.out = stream; + data.closure = closure; +- return TrioFormat(&data, 0, TrioOutStreamCustom, format, NULL, args); ++ return TrioFormat(&data, 0, TrioOutStreamCustom, format, unused, args); + } + + /************************************************************************* +@@ -3827,7 +3831,7 @@ TRIO_VARGS3((buffer, format, va_alist), + assert(VALID(format)); + + TRIO_VA_START(args, format); +- status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); ++ status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL); + *buffer = NIL; /* Terminate with NIL character */ + TRIO_VA_END(args); + return status; +@@ -3853,7 +3857,7 @@ TRIO_ARGS3((buffer, format, args), + assert(VALID(buffer)); + assert(VALID(format)); + +- status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); ++ status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL); + *buffer = NIL; + return status; + } +@@ -3873,12 +3877,13 @@ TRIO_ARGS3((buffer, format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + +- status = TrioFormat(&buffer, 0, TrioOutStreamString, format, NULL, args); ++ status = TrioFormat(&buffer, 0, TrioOutStreamString, format, unused, args); + *buffer = NIL; + return status; + } +@@ -3912,7 +3917,7 @@ TRIO_VARGS4((buffer, max, format, va_alist), + + TRIO_VA_START(args, format); + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, +- TrioOutStreamStringMax, format, &args, NULL); ++ TrioOutStreamStringMax, format, args, NULL); + if (max > 0) + *buffer = NIL; + TRIO_VA_END(args); +@@ -3942,7 +3947,7 @@ TRIO_ARGS4((buffer, max, format, args), + assert(VALID(format)); + + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, +- TrioOutStreamStringMax, format, &args, NULL); ++ TrioOutStreamStringMax, format, args, NULL); + if (max > 0) + *buffer = NIL; + return status; +@@ -3965,13 +3970,14 @@ TRIO_ARGS4((buffer, max, format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, +- TrioOutStreamStringMax, format, NULL, args); ++ TrioOutStreamStringMax, format, unused, args); + if (max > 0) + *buffer = NIL; + return status; +@@ -4003,7 +4009,7 @@ TRIO_VARGS4((buffer, max, format, va_alist), + buffer = &buffer[buf_len]; + + status = TrioFormat(&buffer, max - 1 - buf_len, +- TrioOutStreamStringMax, format, &args, NULL); ++ TrioOutStreamStringMax, format, args, NULL); + TRIO_VA_END(args); + *buffer = NIL; + return status; +@@ -4026,7 +4032,7 @@ TRIO_ARGS4((buffer, max, format, args), + buf_len = trio_length(buffer); + buffer = &buffer[buf_len]; + status = TrioFormat(&buffer, max - 1 - buf_len, +- TrioOutStreamStringMax, format, &args, NULL); ++ TrioOutStreamStringMax, format, args, NULL); + *buffer = NIL; + return status; + } +@@ -4053,7 +4059,7 @@ TRIO_VARGS2((format, va_alist), + { + TRIO_VA_START(args, format); + (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, +- format, &args, NULL); ++ format, args, NULL); + TRIO_VA_END(args); + + trio_string_terminate(info); +@@ -4079,7 +4085,7 @@ TRIO_ARGS2((format, args), + if (info) + { + (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, +- format, &args, NULL); ++ format, args, NULL); + trio_string_terminate(info); + result = trio_string_extract(info); + trio_string_destroy(info); +@@ -4111,7 +4117,7 @@ TRIO_VARGS3((result, format, va_alist), + { + TRIO_VA_START(args, format); + status = TrioFormat(info, 0, TrioOutStreamStringDynamic, +- format, &args, NULL); ++ format, args, NULL); + TRIO_VA_END(args); + if (status >= 0) + { +@@ -4145,7 +4151,7 @@ TRIO_ARGS3((result, format, args), + else + { + status = TrioFormat(info, 0, TrioOutStreamStringDynamic, +- format, &args, NULL); ++ format, args, NULL); + if (status >= 0) + { + trio_string_terminate(info); +@@ -4817,7 +4823,7 @@ TRIO_VARGS3((ref, format, va_alist), + assert(VALID(format)); + + TRIO_VA_START(arglist, format); +- status = TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); ++ status = TrioFormatRef((trio_reference_t *)ref, format, arglist, NULL); + TRIO_VA_END(arglist); + return status; + } +@@ -4834,7 +4840,7 @@ TRIO_ARGS3((ref, format, arglist), + { + assert(VALID(format)); + +- return TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); ++ return TrioFormatRef((trio_reference_t *)ref, format, arglist, NULL); + } + + /************************************************************************* +@@ -6262,7 +6268,7 @@ TRIO_ARGS6((source, sourceSize, InStream, format, argl + size_t sourceSize, + void (*InStream) TRIO_PROTO((trio_class_t *, int *)), + TRIO_CONST char *format, +- va_list *arglist, ++ va_list arglist, + trio_pointer_t *argarray) + { + int status; +@@ -6474,7 +6480,7 @@ TRIO_VARGS2((format, va_alist), + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, +- format, &args, NULL); ++ format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -6489,7 +6495,7 @@ TRIO_ARGS2((format, args), + + return TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, +- format, &args, NULL); ++ format, args, NULL); + } + + TRIO_PUBLIC int +@@ -6498,11 +6504,13 @@ TRIO_ARGS2((format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; ++ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, +- format, NULL, args); ++ format, unused, args); + } + + /************************************************************************* +@@ -6524,7 +6532,7 @@ TRIO_VARGS3((file, format, va_alist), + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, +- format, &args, NULL); ++ format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -6541,7 +6549,7 @@ TRIO_ARGS3((file, format, args), + + return TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, +- format, &args, NULL); ++ format, args, NULL); + } + + TRIO_PUBLIC int +@@ -6551,12 +6559,14 @@ TRIO_ARGS3((file, format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; ++ + assert(VALID(file)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, +- format, NULL, args); ++ format, unused, args); + } + + /************************************************************************* +@@ -6577,7 +6587,7 @@ TRIO_VARGS3((fd, format, va_alist), + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, +- format, &args, NULL); ++ format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -6593,7 +6603,7 @@ TRIO_ARGS3((fd, format, args), + + return TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, +- format, &args, NULL); ++ format, args, NULL); + } + + TRIO_PUBLIC int +@@ -6603,11 +6613,13 @@ TRIO_ARGS3((fd, format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; ++ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, +- format, NULL, args); ++ format, unused, args); + } + + /************************************************************************* +@@ -6631,7 +6643,7 @@ TRIO_VARGS4((stream, closure, format, va_alist), + TRIO_VA_START(args, format); + data.stream.in = stream; + data.closure = closure; +- status = TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); ++ status = TrioScan(&data, 0, TrioInStreamCustom, format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -6651,7 +6663,7 @@ TRIO_ARGS4((stream, closure, format, args), + + data.stream.in = stream; + data.closure = closure; +- return TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); ++ return TrioScan(&data, 0, TrioInStreamCustom, format, args, NULL); + } + + TRIO_PUBLIC int +@@ -6662,6 +6674,7 @@ TRIO_ARGS4((stream, closure, format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; + trio_custom_t data; + + assert(VALID(stream)); +@@ -6669,7 +6682,7 @@ TRIO_ARGS4((stream, closure, format, args), + + data.stream.in = stream; + data.closure = closure; +- return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args); ++ return TrioScan(&data, 0, TrioInStreamCustom, format, unused, args); + } + + /************************************************************************* +@@ -6691,7 +6704,7 @@ TRIO_VARGS3((buffer, format, va_alist), + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, +- format, &args, NULL); ++ format, args, NULL); + TRIO_VA_END(args); + return status; + } +@@ -6708,7 +6721,7 @@ TRIO_ARGS3((buffer, format, args), + + return TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, +- format, &args, NULL); ++ format, args, NULL); + } + + TRIO_PUBLIC int +@@ -6718,12 +6731,14 @@ TRIO_ARGS3((buffer, format, args), + TRIO_CONST char *format, + trio_pointer_t *args) + { ++ static va_list unused; ++ + assert(VALID(buffer)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, +- format, NULL, args); ++ format, unused, args); + } + + /** @} End of Scanf documentation module */ -- Christian "naddy" Weisgerber [email protected]
