From 0fd094f4765737c00f852838c739c702a2e7376f Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Thu, 22 May 2025 08:10:53 -0700 Subject: [PATCH] Fix issue where Hamlib attempts to use memory returned by setlocale() after being freed. --- include/num_stdio.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/num_stdio.h b/include/num_stdio.h index 4ba063a95..f564f097a 100644 --- a/include/num_stdio.h +++ b/include/num_stdio.h @@ -23,6 +23,9 @@ #define _NUM_STDIO_H 1 #include +#include +#include +#include /* * This header file is internal to Hamlib and its backends, @@ -36,27 +39,42 @@ #define num_sscanf(a...) \ ({ int __ret; char *__savedlocale; \ __savedlocale = setlocale(LC_NUMERIC, NULL); \ + if (__savedlocale != NULL) { \ + __savedlocale = strdup(__savedlocale); \ + assert(__savedlocale != NULL); \ + } \ setlocale(LC_NUMERIC, "C"); \ __ret = sscanf(a); \ setlocale(LC_NUMERIC, __savedlocale); \ + if (__savedlocale != NULL) free(__savedlocale); \ __ret; \ }) #define num_sprintf(s, a...) \ ({ int __ret; char *__savedlocale; \ __savedlocale = setlocale(LC_NUMERIC, NULL); \ + if (__savedlocale != NULL) { \ + __savedlocale = strdup(__savedlocale); \ + assert(__savedlocale != NULL); \ + } \ setlocale(LC_NUMERIC, "C"); \ __ret = sprintf(s, a); \ setlocale(LC_NUMERIC, __savedlocale); \ + if (__savedlocale != NULL) free(__savedlocale); \ __ret; \ }) #define num_snprintf(s, n, a...) \ ({ int __ret; char *__savedlocale; \ __savedlocale = setlocale(LC_NUMERIC, NULL); \ + if (__savedlocale != NULL) { \ + __savedlocale = strdup(__savedlocale); \ + assert(__savedlocale != NULL); \ + } \ setlocale(LC_NUMERIC, "C"); \ __ret = snprintf(s, n, a); \ setlocale(LC_NUMERIC, __savedlocale); \ + if (__savedlocale != NULL) free(__savedlocale); \ __ret; \ })