----- On May 19, 2021, at 12:56 PM, lttng-dev lttng-dev@lists.lttng.org wrote:

> Try to use vsnprintf with a 512 Byte buffer on the Stack,
> if that fails allocate a larger one.

I agree with the approach.

Can we move the hardcoded "512" to a #define within src/common/tracer.h ?

Thanks,

Mathieu

> 
> Signed-off-by: Norbert Lange <nolang...@gmail.com>
> ---
> liblttng-ust/tracef.c   | 13 ++++++++++---
> liblttng-ust/tracelog.c | 12 +++++++++---
> 2 files changed, 19 insertions(+), 6 deletions(-)
> 
> diff --git a/liblttng-ust/tracef.c b/liblttng-ust/tracef.c
> index ea98e43e..18c29e25 100644
> --- a/liblttng-ust/tracef.c
> +++ b/liblttng-ust/tracef.c
> @@ -32,17 +32,24 @@
> void _lttng_ust_tracef(const char *fmt, ...)
> {
>       va_list ap;
> -     char *msg;
> +     char local_buf[512];
> +     char *msg = local_buf;
>       int len;
> 
>       va_start(ap, fmt);
> -     len = vasprintf(&msg, fmt, ap);
> +     len = vsnprintf(local_buf, sizeof(local_buf), fmt, ap);
> +     if (len >= sizeof(local_buf)) {
> +             msg = (char *)malloc(len + 1);
> +             len = msg ? vsnprintf(msg, len + 1, fmt, ap) : -1;
> +     }
> +
>       /* len does not include the final \0 */
>       if (len < 0)
>               goto end;
>       __tracepoint_cb_lttng_ust_tracef___event(msg, len,
>               LTTNG_UST_CALLER_IP());
> -     free(msg);
> end:
> +     if (msg != local_buf)
> +             free(msg);
>       va_end(ap);
> }
> diff --git a/liblttng-ust/tracelog.c b/liblttng-ust/tracelog.c
> index 65fc87ed..a5d110fa 100644
> --- a/liblttng-ust/tracelog.c
> +++ b/liblttng-ust/tracelog.c
> @@ -35,19 +35,25 @@
>                       const char *fmt, ...) \
>       { \
>               va_list ap; \
> -             char *msg; \
> +             char local_buf[512]; \
> +             char *msg = local_buf; \
>               int len; \
>               \
>               va_start(ap, fmt); \
> -             len = vasprintf(&msg, fmt, ap); \
> +             len = vsnprintf(local_buf, sizeof(local_buf), fmt, ap); \
> +             if (len >= sizeof(local_buf)) { \
> +                     msg = (char *)malloc(len + 1); \
> +                     len = msg ? vsnprintf(msg, len + 1, fmt, ap) : -1; \
> +             } \
>               /* len does not include the final \0 */ \
>               if (len < 0) \
>                       goto end; \
>               __tracepoint_cb_lttng_ust_tracelog___##level(file, \
>                       line, func, msg, len, \
>                       LTTNG_UST_CALLER_IP()); \
> -             free(msg); \
>       end: \
> +             if (msg != local_buf) \
> +                     free(msg); \
>               va_end(ap); \
>       }
> 
> --
> 2.30.2
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev@lists.lttng.org
> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to