[Asterisk-Dev] Re: [Asterisk-cvs] asterisk logger.c,1.81,1.82
Brian K. West
brian at bkw.org
Wed Sep 14 22:30:25 MST 2005
Anyone else notice this broke logger.c?
/b
On 9/14/05 7:58 PM, "kpfleming at lists.digium.com"
<kpfleming at lists.digium.com> wrote:
> Update of /usr/cvsroot/asterisk
> In directory mongoose.digium.com:/tmp/cvs-serv6611
>
> Modified Files:
> logger.c
> Log Message:
> clean up ast_verbose(), don't hold the lock any longer than needed
>
>
> Index: logger.c
> ===================================================================
> RCS file: /usr/cvsroot/asterisk/logger.c,v
> retrieving revision 1.81
> retrieving revision 1.82
> diff -u -d -r1.81 -r1.82
> --- logger.c 14 Sep 2005 20:46:49 -0000 1.81
> +++ logger.c 14 Sep 2005 23:56:50 -0000 1.82
> @@ -812,46 +812,60 @@
> }
> }
>
> -extern void ast_verbose(const char *fmt, ...)
> +void ast_verbose(const char *fmt, ...)
> {
> static char stuff[4096];
> - static int pos = 0, opos;
> - static int replacelast = 0, complete;
> + static int len = 0;
> + static int replacelast = 0;
> +
> + int complete;
> + int olen;
> struct msglist *m;
> struct verb *v;
> - time_t t;
> - struct tm tm;
> - char date[40];
> - char *datefmt;
>
> va_list ap;
> va_start(ap, fmt);
> - ast_mutex_lock(&msglist_lock);
> - time(&t);
> - localtime_r(&t, &tm);
> - strftime(date, sizeof(date), dateformat, &tm);
>
> if (option_timestamp) {
> + time_t t;
> + struct tm tm;
> + char date[40];
> + char *datefmt;
> +
> + time(&t);
> + localtime_r(&t, &tm);
> + strftime(date, sizeof(date), dateformat, &tm);
> datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1);
> if (datefmt) {
> sprintf(datefmt, "[%s] %s", date, fmt);
> fmt = datefmt;
> }
> }
> - vsnprintf(stuff + pos, sizeof(stuff) - pos, fmt, ap);
> - opos = pos;
> - pos = strlen(stuff);
>
> + /* this lock is also protecting against multiple threads
> + being in this function at the same time, so it must be
> + held before any of the static variables are accessed
> + */
> + ast_mutex_lock(&msglist_lock);
> +
> + /* there is a potential security problem here: if formatting
> + the current date using 'dateformat' results in a string
> + containing '%', then the vsnprintf() call below will
> + probably try to access random memory
> + */
> + vsnprintf(stuff + len, sizeof(stuff) - len, fmt, ap);
> + va_end(ap);
> +
> + olen = len;
> + len = strlen(stuff);
> +
> + complete = (stuff[len - 1] == '\n') ? 1 : 0;
>
> - if (stuff[strlen(stuff)-1] == '\n')
> - complete = 1;
> - else
> - complete=0;
> if (complete) {
> if (msgcnt < MAX_MSG_QUEUE) {
> /* Allocate new structure */
> - m = malloc(sizeof(struct msglist));
> - msgcnt++;
> + if ((m = malloc(sizeof(*m))))
> + msgcnt++;
> } else {
> /* Recycle the oldest entry */
> m = list;
> @@ -874,22 +888,18 @@
> }
> }
> }
> - if (verboser) {
> - v = verboser;
> - while(v) {
> - v->verboser(stuff, opos, replacelast, complete);
> - v = v->next;
> - }
> - } /* else
> - fprintf(stdout, stuff + opos); */
> +
> + for (v = verboser; v; v = v->next)
> + v->verboser(stuff, olen, replacelast, complete);
> +
> ast_log(LOG_VERBOSE, "%s", stuff);
> - if (strlen(stuff)) {
> - if (stuff[strlen(stuff)-1] != '\n')
> +
> + if (len) {
> + if (complete)
> replacelast = 1;
> else
> - replacelast = pos = 0;
> + replacelast = len = 0;
> }
> - va_end(ap);
>
> ast_mutex_unlock(&msglist_lock);
> }
>
> _______________________________________________
> Asterisk-Cvs mailing list
> Asterisk-Cvs at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-cvs
More information about the asterisk-dev
mailing list