dlm_controld: fix name printing error in logging
PATCH 1/1 dlm_controld: fix name printing error in logging
When the length of name_in is NAME_ID_SIZE, the last byte of the name and a whitespace will get lost.
--- dlm_controld/logging.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
dlm_controld/logging.c +2 -2
@@ -122,7 +122,7 @@ static void log_save_str(int len, char *log_buf, unsigned int *point,void log_level (char *name_in,uint32_t level_in,const char *fmt, ...) {va_list ap; -char name[NAME_ID_SIZE +1 ]; +char name[NAME_ID_SIZE +2 ];uint32_t level = level_in &0x0000FFFF ;uint32_t extra = level_in &0xFFFF0000 ;int ret, pos =0 ;
@@ -132,7 +132,7 @@ void log_level(char *name_in, uint32_t level_in, const char *fmt, ...)memset (name,0 ,sizeof (name));if (name_in) -snprintf (name,NAME_ID_SIZE ,"%s " , name_in); +snprintf (name,NAME_ID_SIZE +2 ,"%s " , name_in); ret =snprintf (log_str + pos, len - pos,"%llu %s" , (unsigned long long )monotime (), name);
Signature · 1 line
1.8.1.4
PATCH 1/1 dlm_controld: fix name printing error in logging
Hi,
Quoted 22 lines · Lidong Zhong
When the length of
name_inisNAME_ID_SIZE, the last byte of the name and a whitespace will get lost.Signed-off-by Lidong Zhong <[email protected]>--- dlm_controld/logging.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)dlm_controld/logging.c +1
-1@@ -122,7 +122,7 @@ static void log_save_str(int len, char *log_buf, unsigned int *point,void log_level (char *name_in,uint32_t level_in,const char *fmt, ...) {va_list ap; -char name[NAME_ID_SIZE +1 ]; +char name[NAME_ID_SIZE +2 ];uint32_t level = level_in &0x0000FFFF ;uint32_t extra = level_in &0xFFFF0000 ;int ret, pos =0 ;
dlm_controld/logging.c void log_level(char *name_in, uint32_t level_in, const char *fmt, ...) · line 138
Quoted 8 lines
dlm_controld/logging.c +1
-1@@ -132,7 +132,7 @@ void log_level(char *name_in, uint32_t level_in, const char *fmt, ...)memset (name,0 ,sizeof (name));if (name_in) -snprintf (name,NAME_ID_SIZE ,"%s " , name_in); +snprintf (name,NAME_ID_SIZE +2 ,"%s " , name_in); ret =snprintf (log_str + pos, len - pos,"%llu %s" , (unsigned long long )monotime (), name);
It seems a bit odd to use a temporary buffer here... why not just print the name directly in the second snprintf() call? Something like this:
if (name_in)
ret = snprintf(log_str + pos, len - pos, "%llu %s ",
(unsigned long long)monotime(), name_in);
else
ret = snprintf(log_str + pos, len - pos, "%llu ",
(unsigned long long)monotime());
Or even:
ret = snprintf(log_str + pos, len - pos, name_in ? "%llu %s " : "%llu ", (unsigned long long)monotime(), name_in);
Steve.
PATCH 1/1 dlm_controld: fix name printing error in logging
In reply to Lidong ZhongQuoted 2 lines · Lidong Zhong
When the length of
name_inisNAME_ID_SIZE, the last byte of the name and a whitespace will get lost.
Thanks, I modified your patch to handle longer names also...
commit 4283123f0b13eafc46d825050c5142cf44be79c3
Author: Lidong Zhong <[email protected]> Date: Fri Apr 25 10:52:52 2014 -0500
dlm_controld: fix long name in log entry
When the length of name_in is NAME_ID_SIZE, the last byte of the name and a whitespace will get lost.
(Modified by teigland at redhat.com to also
handle names longer than NAME_ID_SIZE.)
dlm_controld/logging.c +9 -3
@@ -122,17 +122,23 @@ static void log_save_str(int len, char *log_buf, unsigned int *pvoid log_level (char *name_in,uint32_t level_in,const char *fmt, ...) {va_list ap; -char name[NAME_ID_SIZE +1 ]; +char name[NAME_ID_SIZE +2 ];uint32_t level = level_in &0x0000FFFF ;uint32_t extra = level_in &0xFFFF0000 ;int ret, pos =0 ;int len =LOG_STR_LEN -2 ; +int namelen =0 ;int plock = extra &LOG_PLOCK ;memset (name,0 ,sizeof (name)); -if (name_in) -snprintf (name,NAME_ID_SIZE ,"%s " , name_in); +if (name_in) { + namelen =snprintf (name,NAME_ID_SIZE +1 ,"%s" , name_in); +if (namelen >NAME_ID_SIZE ) + namelen =NAME_ID_SIZE ; + name[namelen] =' ' ; + name[namelen+1 ] ='\0' ; + } ret =snprintf (log_str + pos, len - pos,"%llu %s" , (unsigned long long )monotime (), name);