[pacman-dev] [PATCH] 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> --- 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
Dan McGee wrote:
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.
So this was a UseSysLog thing. That would explain why I couldn't replicate when I tried. I will test this later today. Allan
On Sat, Aug 9, 2008 at 5:21 AM, Dan McGee <dan@archlinux.org> wrote:
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> --- 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) {
Why don't we need to run va_start and va_end on args, as in the example on opensuse ML?
On Sun, Aug 10, 2008 at 11:25 AM, Xavier <shiningxc@gmail.com> wrote:
On Sat, Aug 9, 2008 at 5:21 AM, Dan McGee <dan@archlinux.org> wrote:
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> --- 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) {
Why don't we need to run va_start and va_end on args, as in the example on opensuse ML?
Note the difference here. Our function doesn't have the ... in the arg list- we are already passing in a va_list parameter, so the va_start was done elsewhere which gave us the va_list to work on. -Dan
On Sun, Aug 10, 2008 at 6:53 PM, Dan McGee <dpmcgee@gmail.com> wrote:
Note the difference here. Our function doesn't have the ... in the arg list- we are already passing in a va_list parameter, so the va_start was done elsewhere which gave us the va_list to work on.
Oh I see, and alpm_logaction does just that, for this _alpm_logaction function. So that patch looks perfect. Hm, just the commit log that I find a bit confusing : va_list usage is not allowed Shouldnt it be like in the code comment : va_list can't be used more than once
participants (4)
-
Allan McRae
-
Dan McGee
-
Dan McGee
-
Xavier