[PATCH] os: don't malloc memory in LogVMessageVerb.

Alan Coopersmith Alan.Coopersmith at Sun.COM
Thu Apr 16 19:25:28 PDT 2009


Looks good to me.

Acked-by: Alan Coopersmith <alan.coopersmith at sun.com>

	-alan-

Peter Hutterer wrote:
> LogVWrite is limited to a buffer size of 1024, so we don't loose anything here
> by truncating. This way we can use LogVMessageVerb (and xf86Msg and friends)
> during signal handlers with the normal message types.
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> 
> Currently, doing an xf86Msg() during a signal handler is a big no-no, it
> deadlocks the system on malloc when the prefix is prepended. Only X_NONE
> messages bypass this.
> There isn't really a need to malloc though, we're limited to 1024 bytes anyway
> in LogVWrite.
> 
>  os/log.c |   22 ++++++----------------
>  1 files changed, 6 insertions(+), 16 deletions(-)
> 
> diff --git a/os/log.c b/os/log.c
> index 3961b0b..8108890 100644
> --- a/os/log.c
> +++ b/os/log.c
> @@ -316,7 +316,7 @@ void
>  LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
>  {
>      const char *s  = X_UNKNOWN_STRING;
> -    char *tmpBuf = NULL;
> +    char tmpBuf[1024];
>  
>      /* Ignore verbosity for X_ERROR */
>      if (logVerbosity >= verb || logFileVerbosity >= verb || type == X_ERROR) {
> @@ -358,21 +358,11 @@ LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
>  	    break;
>  	}
>  
> -	/*
> -	 * Prefix the format string with the message type.  We do it this way
> -	 * so that LogVWrite() is only called once per message.
> -	 */
> -	if (s) {
> -	    tmpBuf = malloc(strlen(format) + strlen(s) + 1 + 1);
> -	    /* Silently return if malloc fails here. */
> -	    if (!tmpBuf)
> -		return;
> -	    sprintf(tmpBuf, "%s ", s);
> -	    strcat(tmpBuf, format);
> -	    LogVWrite(verb, tmpBuf, args);
> -	    free(tmpBuf);
> -	} else
> -	    LogVWrite(verb, format, args);
> +        /* if s is not NULL we need a space before format */
> +        snprintf(tmpBuf, sizeof(tmpBuf), "%s%s%s", s ? s : "",
> +                                                   s ? " " : "",
> +                                                   format);
> +        LogVWrite(verb, tmpBuf, args);
>      }
>  }
>  

-- 
	-Alan Coopersmith-           alan.coopersmith at sun.com
	 Sun Microsystems, Inc. - X Window System Engineering



More information about the xorg-devel mailing list