diff options
| author | Ovidiu Panait <ovidiu.panait@windriver.com> | 2020-02-27 13:45:49 +0200 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2020-03-16 16:44:53 +0000 |
| commit | ae1001ab3a82de100619878644ff5e20d276eb6c (patch) | |
| tree | 0cfb2de9e93bf7bc5156a582d5c24f922a2b7b4a /meta/recipes-connectivity | |
| parent | f4f272f72c71fe1056f7658b767225139e797b27 (diff) | |
| download | poky-ae1001ab3a82de100619878644ff5e20d276eb6c.tar.gz | |
dhcp: Fix REQUIRE(ctx->running) assertion triggered on SIGTERM/SIGINT
Closed a small window of time between the installation of graceful
shutdown signal handlers and application context startup, during which
the receipt of shutdown signal would cause a REQUIRE() assertion to
occur. Note this issue is only visible when compiling with
ENABLE_GENTLE_SHUTDOWN defined.
Reference:
https://gitlab.isc.org/isc-projects/dhcp/issues/53
Upstream patches:
https://gitlab.isc.org/isc-projects/dhcp/commit/ce117de7a1ed3c4911b4009c1cc23fba85370a26
https://gitlab.isc.org/isc-projects/dhcp/commit/dbd36dfa82956b53683462afadfabb1b33fa3dd1
https://gitlab.isc.org/isc-projects/dhcp/commit/95944cab6035d20be270eec01254c7bb867ec705
(From OE-Core rev: 7235c62727e48415c4e81f852607311ec31b6e41)
Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-connectivity')
4 files changed, 228 insertions, 0 deletions
diff --git a/meta/recipes-connectivity/dhcp/dhcp/0001-Ensure-context-is-running-prior-to-calling-isc_app_c.patch b/meta/recipes-connectivity/dhcp/dhcp/0001-Ensure-context-is-running-prior-to-calling-isc_app_c.patch new file mode 100644 index 0000000000..34b2ae1e5c --- /dev/null +++ b/meta/recipes-connectivity/dhcp/dhcp/0001-Ensure-context-is-running-prior-to-calling-isc_app_c.patch | |||
| @@ -0,0 +1,165 @@ | |||
| 1 | From f369dbb9e67eb5ef336944af63039b6d8f838384 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Thomas Markwalder <tmark@isc.org> | ||
| 3 | Date: Thu, 12 Sep 2019 10:35:46 -0400 | ||
| 4 | Subject: [PATCH 1/3] Ensure context is running prior to calling | ||
| 5 | isc_app_ctxsuspend | ||
| 6 | |||
| 7 | Add a release note. | ||
| 8 | |||
| 9 | includes/omapip/isclib.h | ||
| 10 | Added actx_running flag to global context, dhcp_gbl_ctx | ||
| 11 | |||
| 12 | omapip/isclib.c | ||
| 13 | set_ctx_running() - new function used as the ctxonrun callback | ||
| 14 | |||
| 15 | dhcp_context_create() - installs set_ctx_running callback | ||
| 16 | |||
| 17 | dhcp_signal_handler() - modified to use act_running flag to | ||
| 18 | determine is context is running and should be suspended | ||
| 19 | |||
| 20 | Upstream-Status: Backport [https://gitlab.isc.org/isc-projects/dhcp.git] | ||
| 21 | |||
| 22 | Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com> | ||
| 23 | --- | ||
| 24 | RELNOTES | 7 +++++ | ||
| 25 | includes/omapip/isclib.h | 3 ++- | ||
| 26 | omapip/isclib.c | 57 +++++++++++++++++++++++++++++++++------- | ||
| 27 | 3 files changed, 57 insertions(+), 10 deletions(-) | ||
| 28 | |||
| 29 | diff --git a/RELNOTES b/RELNOTES | ||
| 30 | index f10305d..1730473 100644 | ||
| 31 | --- a/RELNOTES | ||
| 32 | +++ b/RELNOTES | ||
| 33 | @@ -6,6 +6,13 @@ | ||
| 34 | |||
| 35 | NEW FEATURES | ||
| 36 | |||
| 37 | +- Closed a small window of time between the installation of graceful | ||
| 38 | + shutdown signal handlers and application context startup, during which | ||
| 39 | + the receipt of shutdown signal would cause a REQUIRE() assertion to | ||
| 40 | + occur. Note this issue is only visible when compiling with | ||
| 41 | + ENABLE_GENTLE_SHUTDOWN defined. | ||
| 42 | + [Gitlab #53,!18 git TBD] | ||
| 43 | + | ||
| 44 | Please note that that ISC DHCP is now licensed under the Mozilla Public License, | ||
| 45 | MPL 2.0. Please see https://www.mozilla.org/en-US/MPL/2.0/ to read the MPL 2.0 | ||
| 46 | license terms. | ||
| 47 | diff --git a/includes/omapip/isclib.h b/includes/omapip/isclib.h | ||
| 48 | index 6c20584..af6a6fc 100644 | ||
| 49 | --- a/includes/omapip/isclib.h | ||
| 50 | +++ b/includes/omapip/isclib.h | ||
| 51 | @@ -94,7 +94,8 @@ | ||
| 52 | typedef struct dhcp_context { | ||
| 53 | isc_mem_t *mctx; | ||
| 54 | isc_appctx_t *actx; | ||
| 55 | - int actx_started; | ||
| 56 | + int actx_started; // ISC_TRUE if ctxstart has been called | ||
| 57 | + int actx_running; // ISC_TRUE if ctxrun has been called | ||
| 58 | isc_taskmgr_t *taskmgr; | ||
| 59 | isc_task_t *task; | ||
| 60 | isc_socketmgr_t *socketmgr; | ||
| 61 | diff --git a/omapip/isclib.c b/omapip/isclib.c | ||
| 62 | index ce4b4a1..73e017c 100644 | ||
| 63 | --- a/omapip/isclib.c | ||
| 64 | +++ b/omapip/isclib.c | ||
| 65 | @@ -134,6 +134,35 @@ handle_signal(int sig, void (*handler)(int)) { | ||
| 66 | } | ||
| 67 | } | ||
| 68 | |||
| 69 | +/* Callback passed to isc_app_ctxonrun | ||
| 70 | + * | ||
| 71 | + * BIND9 context code will invoke this handler once the context has | ||
| 72 | + * entered the running state. We use it to set a global marker so that | ||
| 73 | + * we can tell if the context is running. Several of the isc_app_ | ||
| 74 | + * calls REQUIRE that the context is running and we need a way to | ||
| 75 | + * know that. | ||
| 76 | + * | ||
| 77 | + * We also check to see if we received a shutdown signal prior to | ||
| 78 | + * the context entering the run state. If we did, then we can just | ||
| 79 | + * simply shut the context down now. This closes the relatively | ||
| 80 | + * small window between start up and entering run via the call | ||
| 81 | + * to dispatch(). | ||
| 82 | + * | ||
| 83 | + */ | ||
| 84 | +static void | ||
| 85 | +set_ctx_running(isc_task_t *task, isc_event_t *event) { | ||
| 86 | + task = task; // unused; | ||
| 87 | + dhcp_gbl_ctx.actx_running = ISC_TRUE; | ||
| 88 | + | ||
| 89 | + if (shutdown_signal) { | ||
| 90 | + // We got signaled shutdown before we entered running state. | ||
| 91 | + // Now that we've reached running state, shut'er down. | ||
| 92 | + isc_app_ctxsuspend(dhcp_gbl_ctx.actx); | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + isc_event_free(&event); | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | isc_result_t | ||
| 99 | dhcp_context_create(int flags, | ||
| 100 | struct in_addr *local4, | ||
| 101 | @@ -141,6 +170,9 @@ dhcp_context_create(int flags, | ||
| 102 | isc_result_t result; | ||
| 103 | |||
| 104 | if ((flags & DHCP_CONTEXT_PRE_DB) != 0) { | ||
| 105 | + dhcp_gbl_ctx.actx_started = ISC_FALSE; | ||
| 106 | + dhcp_gbl_ctx.actx_running = ISC_FALSE; | ||
| 107 | + | ||
| 108 | /* | ||
| 109 | * Set up the error messages, this isn't the right place | ||
| 110 | * for this call but it is convienent for now. | ||
| 111 | @@ -204,15 +236,24 @@ dhcp_context_create(int flags, | ||
| 112 | if (result != ISC_R_SUCCESS) | ||
| 113 | goto cleanup; | ||
| 114 | |||
| 115 | - result = isc_task_create(dhcp_gbl_ctx.taskmgr, 0, &dhcp_gbl_ctx.task); | ||
| 116 | + result = isc_task_create(dhcp_gbl_ctx.taskmgr, 0, | ||
| 117 | + &dhcp_gbl_ctx.task); | ||
| 118 | if (result != ISC_R_SUCCESS) | ||
| 119 | goto cleanup; | ||
| 120 | |||
| 121 | result = isc_app_ctxstart(dhcp_gbl_ctx.actx); | ||
| 122 | if (result != ISC_R_SUCCESS) | ||
| 123 | - return (result); | ||
| 124 | + goto cleanup; | ||
| 125 | + | ||
| 126 | dhcp_gbl_ctx.actx_started = ISC_TRUE; | ||
| 127 | |||
| 128 | + // Install the onrun callback. | ||
| 129 | + result = isc_app_ctxonrun(dhcp_gbl_ctx.actx, dhcp_gbl_ctx.mctx, | ||
| 130 | + dhcp_gbl_ctx.task, set_ctx_running, | ||
| 131 | + dhcp_gbl_ctx.actx); | ||
| 132 | + if (result != ISC_R_SUCCESS) | ||
| 133 | + goto cleanup; | ||
| 134 | + | ||
| 135 | /* Not all OSs support suppressing SIGPIPE through socket | ||
| 136 | * options, so set the sigal action to be ignore. This allows | ||
| 137 | * broken connections to fail gracefully with EPIPE on writes */ | ||
| 138 | @@ -335,19 +376,17 @@ isclib_make_dst_key(char *inname, | ||
| 139 | * @param signal signal code that we received | ||
| 140 | */ | ||
| 141 | void dhcp_signal_handler(int signal) { | ||
| 142 | - isc_appctx_t *ctx = dhcp_gbl_ctx.actx; | ||
| 143 | - int prev = shutdown_signal; | ||
| 144 | - | ||
| 145 | - if (prev != 0) { | ||
| 146 | + if (shutdown_signal != 0) { | ||
| 147 | /* Already in shutdown. */ | ||
| 148 | return; | ||
| 149 | } | ||
| 150 | + | ||
| 151 | /* Possible race but does it matter? */ | ||
| 152 | shutdown_signal = signal; | ||
| 153 | |||
| 154 | - /* Use reload (aka suspend) for easier dispatch() reenter. */ | ||
| 155 | - if (ctx && ctx->methods && ctx->methods->ctxsuspend) { | ||
| 156 | - (void) isc_app_ctxsuspend(ctx); | ||
| 157 | + /* If the application context is running tell it to shut down */ | ||
| 158 | + if (dhcp_gbl_ctx.actx_running == ISC_TRUE) { | ||
| 159 | + (void) isc_app_ctxsuspend(dhcp_gbl_ctx.actx); | ||
| 160 | } | ||
| 161 | } | ||
| 162 | |||
| 163 | -- | ||
| 164 | 2.23.0 | ||
| 165 | |||
diff --git a/meta/recipes-connectivity/dhcp/dhcp/0002-Added-shutdown-log-statment-to-dhcrelay.patch b/meta/recipes-connectivity/dhcp/dhcp/0002-Added-shutdown-log-statment-to-dhcrelay.patch new file mode 100644 index 0000000000..78b2b74f45 --- /dev/null +++ b/meta/recipes-connectivity/dhcp/dhcp/0002-Added-shutdown-log-statment-to-dhcrelay.patch | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | From adcd34ae1f56b16d7e9696d980332b4cf6c7ce91 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Thomas Markwalder <tmark@isc.org> | ||
| 3 | Date: Fri, 13 Sep 2019 15:03:31 -0400 | ||
| 4 | Subject: [PATCH 2/3] Added shutdown log statment to dhcrelay | ||
| 5 | |||
| 6 | Upstream-Status: Backport [https://gitlab.isc.org/isc-projects/dhcp.git] | ||
| 7 | |||
| 8 | Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com> | ||
| 9 | --- | ||
| 10 | relay/dhcrelay.c | 3 +++ | ||
| 11 | 1 file changed, 3 insertions(+) | ||
| 12 | |||
| 13 | diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c | ||
| 14 | index d8caaaf..4bd1d47 100644 | ||
| 15 | --- a/relay/dhcrelay.c | ||
| 16 | +++ b/relay/dhcrelay.c | ||
| 17 | @@ -2076,6 +2076,9 @@ dhcp_set_control_state(control_object_state_t oldstate, | ||
| 18 | if (newstate != server_shutdown) | ||
| 19 | return ISC_R_SUCCESS; | ||
| 20 | |||
| 21 | + /* Log shutdown on signal. */ | ||
| 22 | + log_info("Received signal %d, initiating shutdown.", shutdown_signal); | ||
| 23 | + | ||
| 24 | if (no_pid_file == ISC_FALSE) | ||
| 25 | (void) unlink(path_dhcrelay_pid); | ||
| 26 | |||
| 27 | -- | ||
| 28 | 2.23.0 | ||
| 29 | |||
diff --git a/meta/recipes-connectivity/dhcp/dhcp/0003-Addressed-review-comment.patch b/meta/recipes-connectivity/dhcp/dhcp/0003-Addressed-review-comment.patch new file mode 100644 index 0000000000..a51b6cf526 --- /dev/null +++ b/meta/recipes-connectivity/dhcp/dhcp/0003-Addressed-review-comment.patch | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | From e4b54b4d676783152d487103714cba2913661ef8 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Thomas Markwalder <tmark@isc.org> | ||
| 3 | Date: Wed, 6 Nov 2019 15:53:50 -0500 | ||
| 4 | Subject: [PATCH 3/3] Addressed review comment. | ||
| 5 | |||
| 6 | omapip/isclib.c | ||
| 7 | Added use of IGNORE_UNUSED() | ||
| 8 | |||
| 9 | Upstream-Status: Backport [https://gitlab.isc.org/isc-projects/dhcp.git] | ||
| 10 | |||
| 11 | Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com> | ||
| 12 | --- | ||
| 13 | omapip/isclib.c | 2 +- | ||
| 14 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 15 | |||
| 16 | diff --git a/omapip/isclib.c b/omapip/isclib.c | ||
| 17 | index 73e017c..1d52463 100644 | ||
| 18 | --- a/omapip/isclib.c | ||
| 19 | +++ b/omapip/isclib.c | ||
| 20 | @@ -151,7 +151,7 @@ handle_signal(int sig, void (*handler)(int)) { | ||
| 21 | */ | ||
| 22 | static void | ||
| 23 | set_ctx_running(isc_task_t *task, isc_event_t *event) { | ||
| 24 | - task = task; // unused; | ||
| 25 | + IGNORE_UNUSED(task); | ||
| 26 | dhcp_gbl_ctx.actx_running = ISC_TRUE; | ||
| 27 | |||
| 28 | if (shutdown_signal) { | ||
| 29 | -- | ||
| 30 | 2.23.0 | ||
| 31 | |||
diff --git a/meta/recipes-connectivity/dhcp/dhcp_4.4.1.bb b/meta/recipes-connectivity/dhcp/dhcp_4.4.1.bb index 275961a603..ddc8b60254 100644 --- a/meta/recipes-connectivity/dhcp/dhcp_4.4.1.bb +++ b/meta/recipes-connectivity/dhcp/dhcp_4.4.1.bb | |||
| @@ -11,6 +11,9 @@ SRC_URI += "file://0001-define-macro-_PATH_DHCPD_CONF-and-_PATH_DHCLIENT_CON.pat | |||
| 11 | file://0013-fixup_use_libbind.patch \ | 11 | file://0013-fixup_use_libbind.patch \ |
| 12 | file://0001-master-Added-includes-of-new-BIND9-compatibility-hea.patch \ | 12 | file://0001-master-Added-includes-of-new-BIND9-compatibility-hea.patch \ |
| 13 | file://0001-Fix-a-NSUPDATE-compiling-issue.patch \ | 13 | file://0001-Fix-a-NSUPDATE-compiling-issue.patch \ |
| 14 | file://0001-Ensure-context-is-running-prior-to-calling-isc_app_c.patch \ | ||
| 15 | file://0002-Added-shutdown-log-statment-to-dhcrelay.patch \ | ||
| 16 | file://0003-Addressed-review-comment.patch \ | ||
| 14 | " | 17 | " |
| 15 | 18 | ||
| 16 | SRC_URI[md5sum] = "18c7f4dcbb0a63df25098216d47b1ede" | 19 | SRC_URI[md5sum] = "18c7f4dcbb0a63df25098216d47b1ede" |
