From 1040bbb55a8662dc596271c9935cbc015d6883ac Mon Sep 17 00:00:00 2001 From: Mukund Sivaraman Date: Thu, 26 Feb 2015 14:23:47 +0530 Subject: [PATCH] Fix a segfault when running nslookup (#38548) (cherry picked from commit db93c0def5c3e1e0ea40c7596482ad3fca4ed03b) (cherry picked from commit 9b56539c01be584cff2c3f552daa4f4fb328dc82) Conflicts: lib/isc/app_api.c lib/isc/win32/libisc.def.in --- CHANGES | 4 ++++ bin/dig/dighost.c | 8 ++++++-- bin/dig/nslookup.c | 2 +- lib/isc/include/isc/app.h | 10 ++++++++++ lib/isc/include/isc/namespace.h | 1 + lib/isc/unix/app.c | 15 ++++++++++++++- lib/isc/win32/app.c | 5 +++++ lib/isc/win32/libisc.def.in | 1 + 8 files changed, 42 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index c2306f3c06..fba1bab639 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +4070. [bug] Fix a segfault in nslookup in a query such as + "nslookup isc.org AMS.SNS-PB.ISC.ORG -all". + [RT #38548] + 4069. [doc] Reorganize options in the nsupdate man page. [RT #38516] diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index d6fea27bef..32c1d5dda2 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -3682,10 +3682,14 @@ isc_result_t get_address(char *host, in_port_t myport, isc_sockaddr_t *sockaddr) { int count; isc_result_t result; + isc_boolean_t is_running; - isc_app_block(); + is_running = isc_app_isrunning(); + if (is_running) + isc_app_block(); result = bind9_getaddresses(host, myport, sockaddr, 1, &count); - isc_app_unblock(); + if (is_running) + isc_app_unblock(); if (result != ISC_R_SUCCESS) return (result); diff --git a/bin/dig/nslookup.c b/bin/dig/nslookup.c index d3237fa5dc..30591dc556 100644 --- a/bin/dig/nslookup.c +++ b/bin/dig/nslookup.c @@ -585,7 +585,7 @@ version(void) { static void setoption(char *opt) { - if (strncasecmp(opt, "all", 4) == 0) { + if (strncasecmp(opt, "all", 3) == 0) { show_settings(ISC_TRUE, ISC_FALSE); } else if (strncasecmp(opt, "class=", 6) == 0) { if (testclass(&opt[6])) diff --git a/lib/isc/include/isc/app.h b/lib/isc/include/isc/app.h index 53810859ce..fed029de69 100644 --- a/lib/isc/include/isc/app.h +++ b/lib/isc/include/isc/app.h @@ -203,6 +203,16 @@ isc_app_run(void); *\li ISC_R_RELOAD Reload has been requested. */ +isc_boolean_t +isc_app_isrunning(void); +/*!< + * \brief Return if the ISC library application is running. + * + * Returns: + *\li ISC_TRUE App is running. + *\li ISC_FALSE App is not running. + */ + isc_result_t isc_app_ctxshutdown(isc_appctx_t *ctx); diff --git a/lib/isc/include/isc/namespace.h b/lib/isc/include/isc/namespace.h index 4cfb305ca0..3ec4ceb457 100644 --- a/lib/isc/include/isc/namespace.h +++ b/lib/isc/include/isc/namespace.h @@ -29,6 +29,7 @@ #define isc_app_ctxstart isc__app_ctxstart #define isc_app_onrun isc__app_onrun #define isc_app_run isc__app_run +#define isc_app_isrunning isc__app_isrunning #define isc_app_ctxrun isc__app_ctxrun #define isc_app_shutdown isc__app_shutdown #define isc_app_ctxfinish isc__app_ctxfinish diff --git a/lib/isc/unix/app.c b/lib/isc/unix/app.c index aeebc31f9a..9a4ad968f5 100644 --- a/lib/isc/unix/app.c +++ b/lib/isc/unix/app.c @@ -90,6 +90,7 @@ ISC_APPFUNC_SCOPE isc_result_t isc__app_onrun(isc_mem_t *mctx, void *arg); ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxrun(isc_appctx_t *ctx); ISC_APPFUNC_SCOPE isc_result_t isc__app_run(void); +ISC_APPFUNC_SCOPE isc_boolean_t isc__app_isrunning(void); ISC_APPFUNC_SCOPE isc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx); ISC_APPFUNC_SCOPE isc_result_t isc__app_shutdown(void); ISC_APPFUNC_SCOPE isc_result_t isc__app_reload(void); @@ -145,6 +146,7 @@ typedef struct isc__appctx { } isc__appctx_t; static isc__appctx_t isc_g_appctx; +static isc_boolean_t is_running = ISC_FALSE; static struct { isc_appmethods_t methods; @@ -728,7 +730,18 @@ isc__app_ctxrun(isc_appctx_t *ctx0) { ISC_APPFUNC_SCOPE isc_result_t isc__app_run(void) { - return (isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx)); + isc_result_t result; + + is_running = ISC_TRUE; + result = isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx); + is_running = ISC_FALSE; + + return (result); +} + +ISC_APPFUNC_SCOPE isc_boolean_t +isc__app_isrunning(void) { + return (is_running); } ISC_APPFUNC_SCOPE isc_result_t diff --git a/lib/isc/win32/app.c b/lib/isc/win32/app.c index 8274dea9a8..f2491326f4 100644 --- a/lib/isc/win32/app.c +++ b/lib/isc/win32/app.c @@ -196,6 +196,11 @@ isc__app_run(void) { return (ISC_R_SUCCESS); } +isc_boolean_t +isc__app_isrunning(void) { + return (running); +} + isc_result_t isc__app_shutdown(void) { isc_boolean_t want_kill = ISC_TRUE; diff --git a/lib/isc/win32/libisc.def.in b/lib/isc/win32/libisc.def.in index 35183a2a39..89713e890e 100644 --- a/lib/isc/win32/libisc.def.in +++ b/lib/isc/win32/libisc.def.in @@ -17,6 +17,7 @@ isc___mempool_put isc___socketmgr_maxudp isc__app_block isc__app_finish +isc__app_isrunning isc__app_onrun isc__app_reload isc__app_run