From ff5500b2d933195344cb458e689d26c58a7a5f32 Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 12:31:56 +0200 Subject: [PATCH 1/8] Avoid segfaulting when val.cs is NULL This is the case for BANDSELECT and KEYERTYPE. Use SNPRINTF() which deals with NULLs printing (null) and it is used with the other datatypes.. Steps to reproduce: tests/rigctl -m 1 set_parm KEYERTYPE '?' tests/rigctl -m 1 set_parm BANDSELECT 1 Fixes: Thread 1 "rigctl" received signal SIGSEGV, Segmentation fault. __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:302 warning: 302 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: File o directory non esistente (gdb) bt #0 __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:302 #1 0x00007f8ab4d0b7ab in dummy_set_parm (rig=0x55d19b6cab20, parm=2048, val=...) at dummy.c:1704 #2 0x000055d175b8c03d in rigctl_set_parm (rig=0x55d19b6cab20, fout=0x7f8ab4bf25c0 <_IO_2_1_stdout_>, fin=, interactive=, prompt=, vfo_opt=, send_cmd_term=13 '\r', ext_resp=0, resp_sep=10 '\n', cmd=0x55d175ba9000 , vfo=536870912, arg1=0x7ffd730281e0 "KEYERTYPE", arg2=0x7ffd730283e0 "'?'", arg3=0x55d175b9fce8 "") at rigctl_parse.c:3828 #3 0x000055d175b93756 in rigctl_parse (my_rig=, fin=, fout=, argv=argv@entry=0x7ffd7302a3a8, argc=argc@entry=3, sync_cb=sync_cb@entry=0x0, interactive=, prompt=, vfo_opt=, send_cmd_term=, ext_resp_ptr=, resp_sep_ptr=, use_password=) at rigctl_parse.c:1847 #4 0x000055d175b7dadc in main (argc=, argv=0x7ffd7302a3a8) at rigctl.c:801 --- rigs/dummy/dummy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rigs/dummy/dummy.c b/rigs/dummy/dummy.c index 544de59cc..dc9b5c69a 100644 --- a/rigs/dummy/dummy.c +++ b/rigs/dummy/dummy.c @@ -1701,7 +1701,7 @@ static int dummy_set_parm(RIG *rig, setting_t parm, value_t val) if (RIG_PARM_IS_STRING(parm)) { - strcpy(pstr, val.cs); + SNPRINTF(pstr, sizeof(pstr), "%s", val.cs); } else { From 762caa85c0eb094f0b311aaba74fe686b5e1970c Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 12:54:58 +0200 Subject: [PATCH 2/8] Remove stray char after printing value of KEYERTYPE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Steps to reproduce: tests/rigctl -m 1 get_parm KEYERTYPE STRAIGHT v <-- this 'v' shouldn't be there --- tests/rigctl_parse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 732745b3f..75c1c1bea 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3944,7 +3944,7 @@ declare_proto_rig(get_parm) if (val.i == 1) { s = "BUG"; } else if (val.i == 2) { s = "PADDLE"; } - fprintf(fout, "%s%cv", s, resp_sep); + fprintf(fout, "%s%c", s, resp_sep); } else if (RIG_PARM_IS_FLOAT(parm)) { From a81aab6e116ba34fb20aaf01ae06edbe725d9bff Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 14:20:14 +0200 Subject: [PATCH 3/8] Return an error if the keyer type is unknown Instead of quietly doing nothing. --- tests/rigctl_parse.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 75c1c1bea..849bc23ad 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3745,6 +3745,7 @@ declare_proto_rig(set_parm) if (strcmp(arg2, "STRAIGHT") == 0) {arg2 = "0";} else if (strcmp(arg2, "BUG") == 0) {arg2 = "1";} else if (strcmp(arg2, "PADDLE") == 0) {arg2 = "2";} + else {RETURNFUNC2(-RIG_EINVAL)} } parm = rig_parse_parm(arg1); From 12ba55834370d0b314079f6a67983c11bb26a3b9 Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 14:25:54 +0200 Subject: [PATCH 4/8] Fix segfault with set_parm KEYERTYPE Steps to reproduce: tests/rigctl -m 1 \ set_parm KEYERTYPE BUG Fixes: Thread 1 "rigctl" received signal SIGSEGV, Segmentation fault. __strlen_sse2 () at ../sysdeps/x86_64/multiarch/strlen-sse2.S:142 warning: 142 ../sysdeps/x86_64/multiarch/strlen-sse2.S: File o directory non esistente (gdb) bt #0 __strlen_sse2 () at ../sysdeps/x86_64/multiarch/strlen-sse2.S:142 #1 0x00007ffac346e300 in __printf_buffer (buf=buf@entry=0x7ffc3bcf40d0, format=0x7ffac38aef17 "%s", ap=0x7ffc3bcf4190, mode_flags=0) at ./stdio-common/vfprintf-process-arg.c:435 #2 0x00007ffac3491daf in __vsnprintf_internal (string=, maxlen=, format=, args=args@entry=0x7ffc3bcf4190, mode_flags=mode_flags@entry=0) at ./libio/vsnprintf.c:96 #3 0x00007ffac3469642 in __GI___snprintf (s=s@entry=0x7ffc3bcf4290 "", maxlen=maxlen@entry=32, format=format@entry=0x7ffac38aef17 "%s") at ./stdio-common/snprintf.c:31 #4 0x00007ffac370b7b9 in dummy_set_parm (rig=0x558fe1991b20, parm=2048, val=...) at dummy.c:1704 #5 0x0000558fb536afbe in rigctl_set_parm (rig=0x558fe1991b20, fout=0x7ffac35f25c0 <_IO_2_1_stdout_>, fin=, interactive=, prompt=, vfo_opt=, send_cmd_term=13 '\r', ext_resp=0, resp_sep=10 '\n', cmd=0x558fb5388000 , vfo=536870912, arg1=0x7ffc3bcf4e10 "KEYERTYPE", arg2=0x558fb537fdb1 "1", arg3=0x558fb537ece8 "") at rigctl_parse.c:3829 #6 0x0000558fb53727d6 in rigctl_parse (my_rig=, fin=, fout=, argv=argv@entry=0x7ffc3bcf6fd8, argc=argc@entry=3, sync_cb=sync_cb@entry=0x0, interactive=, prompt=, vfo_opt=, send_cmd_term=, ext_resp_ptr=, resp_sep_ptr=, use_password=) at rigctl_parse.c:1847 #7 0x0000558fb535cadc in main (argc=, argv=0x7ffc3bcf6fd8) at rigctl.c:801 --- tests/rigctl_parse.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 849bc23ad..4bcb0b9d9 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3812,11 +3812,13 @@ declare_proto_rig(set_parm) } else if (RIG_PARM_IS_STRING(parm)) { +#if 0 if (parm == RIG_PARM_KEYERTYPE) { val.i = atoi(arg2); } else +#endif { val.cs = arg2; } From 301391211102efba2e01ecb5fbdd059a2a00071c Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 16:21:57 +0200 Subject: [PATCH 5/8] Make get_param read back the value passed to set_param Test case: tests/rigctl -m 1 \ set_parm KEYERTYPE BUG get_parm KEYERTYPE \ set_parm KEYERTYPE PADDLE get_parm KEYERTYPE \ set_parm KEYERTYPE STRAIGHT get_parm KEYERTYPE BUG PADDLE STRAIGHT --- tests/rigctl_parse.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 4bcb0b9d9..509031227 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3942,12 +3942,14 @@ declare_proto_rig(get_parm) if (parm == RIG_PARM_KEYERTYPE) { - char *s = "STRAIGHT"; + const char *cs; - if (val.i == 1) { s = "BUG"; } - else if (val.i == 2) { s = "PADDLE"; } + if (strcmp(val.cs, "0") == 0) {cs = "STRAIGHT";} + else if (strcmp(val.cs, "1") == 0) {cs = "BUG";} + else if (strcmp(val.cs, "2") == 0) {cs = "PADDLE";} + else {cs = "UNKNOWN";} - fprintf(fout, "%s%c", s, resp_sep); + fprintf(fout, "%s%c", cs, resp_sep); } else if (RIG_PARM_IS_FLOAT(parm)) { From fb4d2c6455d6cbc6b832f9bbc9365bc691e137e3 Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 16:43:32 +0200 Subject: [PATCH 6/8] Fix segfault when using the dummy driver Steps to reproduce: tests/rigctl -m 1 \ get_parm KEYERTYPE Fixes: Thread 1 "rigctl" received signal SIGSEGV, Segmentation fault. 0x0000556aff4f890d in rigctl_get_parm (rig=, fout=0x7f87517f25c0 <_IO_2_1_stdout_>, fin=, interactive=1, prompt=1, vfo_opt=, send_cmd_term=13 '\r', ext_resp=0, resp_sep=10 '\n', cmd=0x556aff516050 , vfo=536870912, arg1=0x7ffc5985b5c0 "KEYERTYPE", arg2=0x556aff50cce8 "", arg3=0x556aff50cce8 "") at rigctl_parse.c:3947 3947 if (strcmp(val.s, "0") == 0) {s = "STRAIGHT";} (gdb) bt #0 0x0000556aff4f890d in rigctl_get_parm (rig=, fout=0x7f87517f25c0 <_IO_2_1_stdout_>, fin=, interactive=1, prompt=1, vfo_opt=, send_cmd_term=13 '\r', ext_resp=0, resp_sep=10 '\n', cmd=0x556aff516050 , vfo=536870912, arg1=0x7ffc5985b5c0 "KEYERTYPE", arg2=0x556aff50cce8 "", arg3=0x556aff50cce8 "") at rigctl_parse.c:3947 #1 0x0000556aff5007f6 in rigctl_parse (my_rig=, fin=, fout=, argv=argv@entry=0x7ffc5985d788, argc=argc@entry=3, sync_cb=sync_cb@entry=0x0, interactive=, prompt=, vfo_opt=, send_cmd_term=, ext_resp_ptr=, resp_sep_ptr=, use_password=) at rigctl_parse.c:1847 #2 0x0000556aff4eaadc in main (argc=, argv=0x7ffc5985d788) at rigctl.c:801 --- tests/rigctl_parse.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 509031227..2fef0aadc 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3944,7 +3944,8 @@ declare_proto_rig(get_parm) { const char *cs; - if (strcmp(val.cs, "0") == 0) {cs = "STRAIGHT";} + if (val.cs == NULL) {cs = "(null)";} + else if (strcmp(val.cs, "0") == 0) {cs = "STRAIGHT";} else if (strcmp(val.cs, "1") == 0) {cs = "BUG";} else if (strcmp(val.cs, "2") == 0) {cs = "PADDLE";} else {cs = "UNKNOWN";} From b5b9e136a14138a33c79f782b01e9e586dbc22ea Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 17:27:06 +0200 Subject: [PATCH 7/8] Do not use strcmp() when we are going to get a RIG_PARM_* define anyway --- tests/rigctl_parse.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 2fef0aadc..8503317e6 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3717,7 +3717,9 @@ declare_proto_rig(set_parm) RETURNFUNC2(RIG_OK); } - if (strcmp(arg1, "BANDSELECT") == 0 && !strcmp(arg2, "?")) + parm = rig_parse_parm(arg1); + + if (parm == RIG_PARM_BANDSELECT && !strcmp(arg2, "?")) { char s[SPRINTF_MAX_SIZE]; rig_sprintf_parm_gran(s, sizeof(s) - 1, RIG_PARM_BANDSELECT, @@ -3740,7 +3742,7 @@ declare_proto_rig(set_parm) else { RETURNFUNC2(-RIG_EINTERNAL); } } - if (strcmp(arg1, "KEYERTYPE") == 0 && strcmp(arg2, "?") != 0) + if (parm == RIG_PARM_KEYERTYPE && strcmp(arg2, "?") != 0) { if (strcmp(arg2, "STRAIGHT") == 0) {arg2 = "0";} else if (strcmp(arg2, "BUG") == 0) {arg2 = "1";} @@ -3748,8 +3750,6 @@ declare_proto_rig(set_parm) else {RETURNFUNC2(-RIG_EINVAL)} } - parm = rig_parse_parm(arg1); - if (!rig_has_set_parm(rig, parm)) { const struct confparams *cfp; From 2f2b703ccf9417ca07b7f1e54603514f89ebea31 Mon Sep 17 00:00:00 2001 From: Daniele Forsi IU5HKX Date: Wed, 13 Aug 2025 22:02:59 +0200 Subject: [PATCH 8/8] Handle the question mark as second argument of set_parm KEYERTYPE in rigctl Test case: tests/rigctl -m 1 \ set_parm KEYERTYPE '?' \ set_parm BANDSELECT '?' STRAIGHT BUG PADDLE BANDUNUSED BAND70CM BAND33CM BAND23CM --- tests/rigctl_parse.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 8503317e6..711dd7502 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3719,11 +3719,10 @@ declare_proto_rig(set_parm) parm = rig_parse_parm(arg1); - if (parm == RIG_PARM_BANDSELECT && !strcmp(arg2, "?")) + if ((parm == RIG_PARM_BANDSELECT || parm == RIG_PARM_KEYERTYPE) && !strcmp(arg2, "?")) { char s[SPRINTF_MAX_SIZE]; - rig_sprintf_parm_gran(s, sizeof(s) - 1, RIG_PARM_BANDSELECT, - rig->caps->parm_gran); + rig_sprintf_parm_gran(s, sizeof(s) - 1, parm, rig->caps->parm_gran); char *p = strchr(s, ')'); if (p) { *p = 0; }