diff options
author | Dan McGee <dan@archlinux.org> | 2008-08-09 05:18:00 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2008-08-09 05:18:00 +0200 |
commit | d8f8a126658a25fdad5e9fb00b1b0838a7e93c68 (patch) | |
tree | 43d8fe7ac5545c3705bbabdf1177cbfe480d8f87 /lib/libalpm | |
parent | 57393eb730641ca912a421b70897fcd289c44b21 (diff) | |
download | pacman-d8f8a126658a25fdad5e9fb00b1b0838a7e93c68.tar.gz pacman-d8f8a126658a25fdad5e9fb00b1b0838a7e93c68.tar.xz |
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>
Diffstat (limited to 'lib/libalpm')
-rw-r--r-- | 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 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) { |