From aee55b0595ab6b2b37843439f47dc74e77e0f5bb Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Thu, 26 Apr 2018 10:00:31 +0200 Subject: [PATCH] Use fixed buffer in log function. And unify EOL for error and verbose messages. --- lib/internal.h | 2 +- lib/setup.c | 9 ++++++--- src/utils_tools.c | 15 ++++++++------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/internal.h b/lib/internal.h index d6fbae1b..07a1a083 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -50,7 +50,7 @@ #define MAX_SECTOR_SIZE 4096 /* min page size among all platforms */ #define DEFAULT_DISK_ALIGNMENT 1048576 /* 1MiB */ #define DEFAULT_MEM_ALIGNMENT 4096 -#define MAX_ERROR_LENGTH 512 +#define LOG_MAX_LEN 4096 #define at_least(a, b) ({ __typeof__(a) __at_least = (a); (__at_least >= (b))?__at_least:(b); }) diff --git a/lib/setup.c b/lib/setup.c index 1a22f5aa..a195078d 100644 --- a/lib/setup.c +++ b/lib/setup.c @@ -154,12 +154,16 @@ void logger(struct crypt_device *cd, int level, const char *file, int line, const char *format, ...) { va_list argp; - char *target = NULL; + char target[LOG_MAX_LEN + 2]; va_start(argp, format); - if (vasprintf(&target, format, argp) > 0 ) { + if (vsnprintf(&target[0], LOG_MAX_LEN, format, argp) > 0 ) { if (level >= 0) { + /* All verbose and error messages in tools end with EOL. */ + if (level == CRYPT_LOG_VERBOSE || level == CRYPT_LOG_ERROR) + strncat(target, "\n", LOG_MAX_LEN); + crypt_log(cd, level, target); #ifdef CRYPT_DEBUG } else if (_debug_level) @@ -171,7 +175,6 @@ void logger(struct crypt_device *cd, int level, const char *file, } va_end(argp); - free(target); } static const char *mdata_device_path(struct crypt_device *cd) diff --git a/src/utils_tools.c b/src/utils_tools.c index e43ee935..e1cfeb6c 100644 --- a/src/utils_tools.c +++ b/src/utils_tools.c @@ -76,17 +76,23 @@ void check_signal(int *r) *r = -EINTR; } +#define LOG_MAX_LEN 4096 + __attribute__((format(printf, 5, 6))) void clogger(struct crypt_device *cd, int level, const char *file, int line, const char *format, ...) { va_list argp; - char *target = NULL; + char target[LOG_MAX_LEN + 2]; va_start(argp, format); - if (vasprintf(&target, format, argp) > 0) { + if (vsnprintf(&target[0], LOG_MAX_LEN, format, argp) > 0) { if (level >= 0) { + /* All verbose and error messages in tools end with EOL. */ + if (level == CRYPT_LOG_VERBOSE || level == CRYPT_LOG_ERROR) + strncat(target, "\n", LOG_MAX_LEN); + crypt_log(cd, level, target); #ifdef CRYPT_DEBUG } else if (opt_debug) @@ -98,11 +104,6 @@ void clogger(struct crypt_device *cd, int level, const char *file, int line, } va_end(argp); - free(target); - - /* All verbose and error messages in tools end with EOL. */ - if (level == CRYPT_LOG_VERBOSE || level == CRYPT_LOG_ERROR) - crypt_log(cd, level, "\n"); } void tool_log(int level, const char *msg, void *usrptr __attribute__((unused)))