From c579df90e4576b4de7d18e3fb35f102cda272b76 Mon Sep 17 00:00:00 2001 From: Yacine Belkadi Date: Fri, 18 Mar 2011 10:08:44 +0100 Subject: cleo/devkit/plcd: fix possible signal loss, refs #2374 Fix: - a signal may be lost if it occurs in the middle of the decrementation of is_process_signal_needed. - the compiler could optimize operations on is_process_signal_needed in ways that may affect the expected behavior of the code. --- cleopatre/devkit/plcd/inc/plcd.h | 2 +- cleopatre/devkit/plcd/src/plcd_main.c | 5 +++-- cleopatre/devkit/plcd/src/plcd_stack.c | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cleopatre/devkit/plcd/inc/plcd.h b/cleopatre/devkit/plcd/inc/plcd.h index e314d84f42..7b999b1088 100644 --- a/cleopatre/devkit/plcd/inc/plcd.h +++ b/cleopatre/devkit/plcd/inc/plcd.h @@ -223,7 +223,7 @@ typedef struct /* Global variable indicating if a SIGHUP signal occurred, * has been caught in plcd signal handler, * and has now to be processed. */ -extern uint8_t is_process_signal_needed; +extern volatile sig_atomic_t is_process_signal_needed; int plcd_send_recv_drv_mme (const plcd_ctx_t *ctx, const mme_ctx_t *request_ctx, mme_ctx_t *confirm_ctx, mme_ctx_t *indication_ctx); diff --git a/cleopatre/devkit/plcd/src/plcd_main.c b/cleopatre/devkit/plcd/src/plcd_main.c index 955d59e144..0194a14557 100644 --- a/cleopatre/devkit/plcd/src/plcd_main.c +++ b/cleopatre/devkit/plcd/src/plcd_main.c @@ -34,7 +34,8 @@ static spc300_nvram_t g_nvram; -uint8_t is_process_signal_needed = 0; + +volatile sig_atomic_t is_process_signal_needed; /******************************************************************************/ @@ -72,7 +73,7 @@ plcd_signal_handler (int signal_nb) /* check that we received a SIGHUP signal (other signals must be ignored) */ if (SIGHUP == signal_nb) { - is_process_signal_needed++; + is_process_signal_needed = 1; } } diff --git a/cleopatre/devkit/plcd/src/plcd_stack.c b/cleopatre/devkit/plcd/src/plcd_stack.c index 43436a6d12..f9bd98c5c9 100644 --- a/cleopatre/devkit/plcd/src/plcd_stack.c +++ b/cleopatre/devkit/plcd/src/plcd_stack.c @@ -211,9 +211,10 @@ plcd_stack_event_dispatch (plcd_ctx_t *ctx) if (is_process_signal_needed) { + is_process_signal_needed = 0; + /* now handle all config / info files changes (from spidapp / managerd) */ plcd_process_signal (ctx); - is_process_signal_needed--; } /* After processing, check if some other actions have to be performed. -- cgit v1.2.3