From: Andrii Simiklit <[email protected]>
MSDN:
"va_end must be called on each argument list that's initialized
with va_start or va_copy before the function returns."
v2: Linux man about vXXXprintf functions:
"These functions do not call the va_end macro. Because they
invoke the va_arg macro, the value of ap is undefined after the call"
So we should have instance copy of va_list for each 'vXXXprintf' call.
v3: Fixed case when malloc returns 0 in util_vasprintf
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107810
Signed-off-by: Andrii Simiklit <[email protected]>
---
src/util/u_string.h | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/util/u_string.h b/src/util/u_string.h
index ce45430..e408146 100644
--- a/src/util/u_string.h
+++ b/src/util/u_string.h
@@ -81,6 +81,7 @@ util_vsnprintf(char *str, size_t size, const char *format,
va_list ap)
if (ret < 0) {
ret = _vscprintf(format, ap_copy);
}
+ va_end(ap_copy);
return ret;
}
@@ -119,14 +120,14 @@ util_vasprintf(char **ret, const char *format, va_list ap)
/* Compute length of output string first */
va_copy(ap_copy, ap);
- int r = util_vsnprintf(NULL, 0, format, ap);
+ int r = util_vsnprintf(NULL, 0, format, ap_copy);
va_end(ap_copy);
if (r < 0)
return -1;
*ret = (char *) malloc(r + 1);
- if (!ret)
+ if (!*ret)
return -1;
/* Print to buffer */
--
2.7.4
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev