[pacman-dev] [PATCH] Fix segfault on x86_64 when using UseSyslog

Dan McGee dan at archlinux.org
Fri Aug 8 23:21:46 EDT 2008


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 at archlinux.org>
---
 lib/libalpm/util.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index c38dfb5..2847db7 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) {
-- 
1.5.6.5




More information about the pacman-dev mailing list