From a8fe08cdf3f67da8340c2e903aed12a7192dddb9 Mon Sep 17 00:00:00 2001 From: "Christian W. Zuckschwerdt" Date: Mon, 11 Mar 2024 12:11:42 +0100 Subject: [PATCH] Fix event callback on shutdown (closes #2869) --- src/r_api.c | 7 +++++++ src/rtl_433.c | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/r_api.c b/src/r_api.c index c11fc0e75..dc9f910c4 100644 --- a/src/r_api.c +++ b/src/r_api.c @@ -209,9 +209,11 @@ void r_free_cfg(r_cfg_t *cfg) if (cfg->dev) { sdr_deactivate(cfg->dev); sdr_close(cfg->dev); + cfg->dev = NULL; } free(cfg->gain_str); + cfg->gain_str = NULL; for (void **iter = cfg->demod->dumper.elems; iter && *iter; ++iter) { file_info_t const *dumper = *iter; @@ -224,8 +226,10 @@ void r_free_cfg(r_cfg_t *cfg) if (cfg->demod->am_analyze) am_analyze_free(cfg->demod->am_analyze); + cfg->demod->am_analyze = NULL; pulse_detect_free(cfg->demod->pulse_detect); + cfg->demod->pulse_detect = NULL; list_free_elems(&cfg->raw_handler, (list_elem_free_fn)raw_output_free); @@ -238,11 +242,14 @@ void r_free_cfg(r_cfg_t *cfg) list_free_elems(&cfg->in_files, NULL); free(cfg->demod); + cfg->demod = NULL; free(cfg->devices); + cfg->devices = NULL; mg_mgr_free(cfg->mgr); free(cfg->mgr); + cfg->mgr = NULL; //free(cfg); } diff --git a/src/rtl_433.c b/src/rtl_433.c index 3a33284f1..c66f427b8 100644 --- a/src/rtl_433.c +++ b/src/rtl_433.c @@ -394,6 +394,11 @@ static void sdr_callback(unsigned char *iq_buf, uint32_t len, void *ctx) char time_str[LOCAL_TIME_BUFLEN]; unsigned long n_samples; + if (!demod) { + // might happen when the demod closed and we get a last data frame + return; // ignore the data + } + // do this here and not in sdr_handler so realtime replay can use rtl_tcp output for (void **iter = cfg->raw_handler.elems; iter && *iter; ++iter) { raw_output_t *output = *iter; @@ -1367,6 +1372,7 @@ static void sighandler(int signum) } #endif +// NOTE: this handler might be called while already in `r_free_cfg()`. static void sdr_handler(struct mg_connection *nc, int ev_type, void *ev_data) { //fprintf(stderr, "%s: %d, %d, %p, %p\n", __func__, nc->sock, ev_type, nc->user_data, ev_data); @@ -1441,6 +1447,13 @@ static void acquire_callback(sdr_event_t *ev, void *ctx) static int start_sdr(r_cfg_t *cfg) { int r; + if (cfg->dev) { + r = sdr_close(cfg->dev); + cfg->dev = NULL; + if (r < 0) { + print_logf(LOG_ERROR, "Input", "Closing SDR failed (%d)", r); + } + } r = sdr_open(&cfg->dev, cfg->dev_query, cfg->verbosity); if (r < 0) { return -1; // exit(2);