vlib: set log tap level <level> does not work for some keywords 41/12141/2
authorSteven <sluong@cisco.com>
Wed, 25 Apr 2018 18:29:00 +0000 (11:29 -0700)
committerDamjan Marion <dmarion.lists@gmail.com>
Thu, 26 Apr 2018 18:05:53 +0000 (18:05 +0000)
While some levels such as debug and emerg work, others don't. See below.

DBGvpp# set log class tap level warn
set log class tap level warn
set logging class: unknown input `level warn'
DBGvpp# set log class tap level debug
set log class tap level debug
DBGvpp# set log class tap level info
set log class tap level info
set logging class: unknown input `level info'
DBGvpp# set log class tap level err
set log class tap level err
DBGvpp# set log class tap level crit
set log class tap level crit
set logging class: unknown input `level crit'
DBGvpp# set log class tap level emerg
set log class tap level emerg
DBGvpp#

Cause:
The reason for the failure for the shorter keywords is level_str is unformatted
with %v which is not null terminated. For example, the character after "info"
could be anything in level_str. The memcmp with size of the macro keyword __##uc
which includes the null character or 5 in this case and thus the comparison fails.

Fix:
Use %s which insure level_str is null terminated. Use strcmp to rule out
false positve match like "debugxxx" against keyword "debug".

Change-Id: I7a2d97a0f7f618df105da7eca791618dce04d21e
Signed-off-by: Steven <sluong@cisco.com>
src/vlib/log.c

index aa6fe0c..1160c04 100644 (file)
@@ -399,11 +399,11 @@ unformat_vlib_log_level (unformat_input_t * input, va_list * args)
   vlib_log_level_t *level = va_arg (*args, vlib_log_level_t *);
   u8 *level_str = NULL;
   uword rv = 1;
-  if (unformat (input, "%v", &level_str))
+  if (unformat (input, "%s", &level_str))
     {
 #define _(v, uc, lc)                                   \
   const char __##uc[] = #lc;                           \
-  if (!memcmp (level_str, __##uc, sizeof (__##uc))) \
+  if (!strcmp ((const char *) level_str, __##uc))      \
     {                                                  \
       *level = VLIB_LOG_LEVEL_##uc;                 \
       rv = 1;                                          \