From 6fbb0986121b8865eaf2c1bcd36082dfeb4290f3 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Sun, 29 Jan 2023 15:50:27 -0600 Subject: [PATCH] Fix segfault using python Hamlib.rig_parse_mode(None) Argument really needed to be 'None' but now prints out better error message https://github.com/Hamlib/Hamlib/issues/1227 --- Segfault-award | 2 ++ src/misc.c | 13 ++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Segfault-award b/Segfault-award index e09c67497..4bf3b4be2 100644 --- a/Segfault-award +++ b/Segfault-award @@ -7,6 +7,8 @@ A developer cannot apply for HSHR for segfaults on his/her own code. Here is the list of the brave fellows: +* Christoph Berg DF7CB python with Hamlib.rig_parse(None) + * Saku Nyland OH1KH v4.5.1, 10/2022, rigctld.c using ptt_type=RTS * David Kjellquist WB5NHL, v1.1.3, 09/2002, kenwood/ts570.c diff --git a/src/misc.c b/src/misc.c index a82a23607..439f8382e 100644 --- a/src/misc.c +++ b/src/misc.c @@ -496,7 +496,8 @@ static const struct { RIG_MODE_IQ, "IQ"}, { RIG_MODE_ISBUSB, "ISBUSB"}, { RIG_MODE_ISBLSB, "ISBLSB"}, - { RIG_MODE_NONE, "" }, + { RIG_MODE_NONE, "None" }, // so we can reutnr None when NONE is requested + { -1, "" }, // need to end list }; @@ -513,7 +514,7 @@ rmode_t HAMLIB_API rig_parse_mode(const char *s) rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - for (i = 0 ; mode_str[i].str[0] != '\0'; i++) + for (i = 0 ; (s != NULL) && (mode_str[i].str[0] != '\0'); i++) { if (!strcmp(s, mode_str[i].str)) { @@ -521,7 +522,7 @@ rmode_t HAMLIB_API rig_parse_mode(const char *s) } } - rig_debug(RIG_DEBUG_WARN, "%s: mode '%s' not found\n", __func__, s); + rig_debug(RIG_DEBUG_WARN, "%s: mode '%s' not found...returning RIG_MODE_NONE\n", __func__, s); return RIG_MODE_NONE; } @@ -1915,7 +1916,9 @@ vfo_t HAMLIB_API vfo_fixup(RIG *rig, vfo_t vfo, split_t split) if (VFO_HAS_MAIN_SUB_ONLY) { vfo = RIG_VFO_MAIN; } - if (VFO_HAS_MAIN_SUB_A_B_ONLY) { vfo = RIG_VFO_MAIN; } + //in this case we don't change it as either VFOA/B or Main/Sub makes a difference + //ID5100 for example has to turn on dual watch mode for Main/Sub + //if (VFO_HAS_MAIN_SUB_A_B_ONLY) { vfo = RIG_VFO_MAIN; } } else if (vfo == RIG_VFO_TX) { @@ -1963,7 +1966,7 @@ vfo_t HAMLIB_API vfo_fixup(RIG *rig, vfo_t vfo, split_t split) if (VFO_HAS_MAIN_SUB_ONLY) { vfo = RIG_VFO_SUB; } - if (VFO_HAS_MAIN_SUB_A_B_ONLY) { vfo = RIG_VFO_SUB; } + //if (VFO_HAS_MAIN_SUB_A_B_ONLY) { vfo = RIG_VFO_SUB; } rig_debug(RIG_DEBUG_TRACE, "%s: final vfo=%s\n", __func__, rig_strvfo(vfo)); }