summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYacine Belkadi2011-03-18 10:08:44 +0100
committerYacine Belkadi2011-03-23 16:55:56 +0100
commitc579df90e4576b4de7d18e3fb35f102cda272b76 (patch)
treeefbce72fe3ad5352f75ee1784dc67d91c927ec2c
parent8a556336dc445143b92ddb6a97194778b9fd8bd8 (diff)
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.
-rw-r--r--cleopatre/devkit/plcd/inc/plcd.h2
-rw-r--r--cleopatre/devkit/plcd/src/plcd_main.c5
-rw-r--r--cleopatre/devkit/plcd/src/plcd_stack.c3
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.