From 9f3f18f99fd321cdcfc331e92b10b64f0ef590b3 Mon Sep 17 00:00:00 2001 From: hanlin Date: Mon, 30 Dec 2019 16:25:20 +0800 Subject: [PATCH] vcl: hold errno when calling LDBG 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 Change-Id: I7a90f3a14772994f11f09650481411796e3f5630 --- src/vcl/ldp.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vcl/ldp.c b/src/vcl/ldp.c index e53a61e8e8c..34eba377451 100644 --- a/src/vcl/ldp.c +++ b/src/vcl/ldp.c @@ -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), -- 2.16.6