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

Dan McGee dpmcgee at gmail.com
Sun Aug 10 12:53:46 EDT 2008


On Sun, Aug 10, 2008 at 11:25 AM, Xavier <shiningxc at gmail.com> wrote:
> On Sat, Aug 9, 2008 at 5:21 AM, Dan McGee <dan at 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 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) {
>
> 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



More information about the pacman-dev mailing list