vcl: hold errno when calling LDBG 42/24142/2
authorhanlin <hanlin_wang@163.com>
Mon, 30 Dec 2019 08:25:20 +0000 (16:25 +0800)
committerFlorin Coras <florin.coras@gmail.com>
Mon, 30 Dec 2019 17:26:18 +0000 (17:26 +0000)
Type: fix

Call trace of LDBG:
LDBG->clib_warning->_clib_error->dispatch_message->os_puts->writev
However, writev will hijacked by LDP, and then execute following code:
if ((errno = -ldp_init ()))
    return -1;
Now, errno will be set.

Because we always call LDBG just before return from ldp_accept4, listen,
and etc. So errno will be overwritted after LDBG called.

Signed-off-by: hanlin <hanlin_wang@163.com>
Change-Id: I7a90f3a14772994f11f09650481411796e3f5630

src/vcl/ldp.c

index e53a61e..34eba37 100644 (file)
@@ -109,7 +109,11 @@ typedef struct
 
 #define LDBG(_lvl, _fmt, _args...)                                     \
   if (ldp->debug > _lvl)                                               \
-    clib_warning ("ldp<%d>: " _fmt, getpid(), ##_args)
+    {                                                                  \
+      int errno_saved = errno;                                         \
+      clib_warning ("ldp<%d>: " _fmt, getpid(), ##_args);              \
+      errno = errno_saved;                                             \
+    }
 
 static ldp_main_t ldp_main = {
   .vlsh_bit_val = (1 << LDP_SID_BIT_MIN),