summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2008-08-08 22:18:00 -0500
committerDan McGee <dan@archlinux.org>2008-08-08 22:18:00 -0500
commitd8f8a126658a25fdad5e9fb00b1b0838a7e93c68 (patch)
tree43d8fe7ac5545c3705bbabdf1177cbfe480d8f87
parent57393eb730641ca912a421b70897fcd289c44b21 (diff)
Fix segfault on x86_64 when using UseSyslog
Due to differences in handling va_list between i686 and x86_64, this bug can only be seen on x86_64. va_list usage is not allowed but we had been getting away with it. See http://lists.opensuse.org/opensuse-programming/2008-02/msg00005.html for details and explanation. This fixes FS#11096. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/util.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index c38dfb5d..2847db7b 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
@@ -401,12 +402,18 @@ int _alpm_rmrf(const char *path)
return(0);
}
-int _alpm_logaction(unsigned short usesyslog, FILE *f, const char *fmt, va_list args)
+int _alpm_logaction(unsigned short usesyslog, FILE *f,
+ const char *fmt, va_list args)
{
int ret = 0;
if(usesyslog) {
- vsyslog(LOG_WARNING, fmt, args);
+ /* we can't use a va_list more than once, so we need to copy it
+ * so we can use the original when calling vfprintf below. */
+ va_list args_syslog;
+ va_copy(args_syslog, args);
+ vsyslog(LOG_WARNING, fmt, args_syslog);
+ va_end(args_syslog);
}
if(f) {