Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Feb 2004 15:12:40 -0500
From:      Bill Moran <wmoran@potentialtech.com>
To:        freebsd-chat@freebsd.org
Subject:   Could use some help with variable length argument lists
Message-ID:  <40293B38.30401@potentialtech.com>

next in thread | raw e-mail | index | archive | help
I'm so frustrated I could cry.

I want my application to be able to do all kinds of logging, so I wrote a log
function:

void
_log(int level, const char *message, ...)
{
     va_list ap;
     char **format, **errmsg;

     va_start(ap, message);
     if (level <= LOGLEVEL) {
         asprintf(format, "PID %d: %s", getpid(), message);
         vasprintf(errmsg, *format, ap);
         free(*format);
         syslog(LOG_INFO | LOG_LOCAL1, *errmsg);
         if (LOGLEVEL == 10)
             printf(*errmsg);
         free(*errmsg);
     }
     va_end(ap);
}

Doesn't seem too difficult, right?  However, if I call the function
from elsewhere in my application like this:

_log(1, "Log test");

I get a coredump!  gdb complains that message is "out of bounds"
on the line "asprintf(format, "PID %d: %s", getpid(), message);"

I'm at the end of my rope with this.  I really need a way to easily
log with variable arguments or I'll never get some other issues with
this application debugged!  If I tweak the _log function to this:

void
_log(int level, char *message)
{
     if (level <= LOGLEVEL) {
         syslog(LOG_INFO | LOG_LOCAL1, "PID %d: %s", getpid(), message);
         if (LOGLEVEL == 10)
             printf("PID %d: %s", getpid(), message);
     }
}

everything works just dandy (I haven't changed any other code anywhere
else!  I'm not _using_ variable arguments to _log() yet)

What is is between these two functions that causes the first one to
coredump, yet the second one works fine?  I can only guess that my
usage of va_* isn't quite right, but how is that affecting the message
pointer?

-- 
Bill Moran
Potential Technologies
http://www.potentialtech.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?40293B38.30401>