Fix potential overflow in sprintflst.c

pull/1640/head
Michael Black W9MDB 2024-12-22 11:36:45 -06:00
rodzic 750adb40b5
commit 45cc53a526
1 zmienionych plików z 17 dodań i 5 usunięć

Wyświetl plik

@ -719,7 +719,6 @@ int rig_sprintf_scan(char *str, int nlen, scan_t rscan)
return len; return len;
} }
int rot_sprintf_status(char *str, int nlen, rot_status_t status) int rot_sprintf_status(char *str, int nlen, rot_status_t status)
{ {
int len = 0; int len = 0;
@ -735,20 +734,33 @@ int rot_sprintf_status(char *str, int nlen, rot_status_t status)
for (i = 0; i < HAMLIB_MAX_ROTORS; i++) for (i = 0; i < HAMLIB_MAX_ROTORS; i++)
{ {
const char *sv; const char *sv = rot_strstatus(status & ROT_STATUS_N(i));
sv = rot_strstatus(status & ROT_STATUS_N(i));
if (sv && sv[0] && (strstr(sv, "None") == 0)) if (sv && sv[0] && (strstr(sv, "None") == 0))
{ {
len += snprintf(str + len, nlen - len, "%s ", sv); int written = snprintf(str + len, nlen - len, "%s ", sv);
if (written < 0 || written >= nlen - len)
{
// Truncate and break if there's no space left
len = nlen - 1;
str[len] = '\0';
break;
}
len += written;
} }
check_buffer_overflow(str, len, nlen); if (len >= nlen)
{
// Ensure null-termination and avoid overflow
str[nlen - 1] = '\0';
break;
}
} }
return len; return len;
} }
int rig_sprintf_spectrum_modes(char *str, int nlen, int rig_sprintf_spectrum_modes(char *str, int nlen,
const enum rig_spectrum_mode_e *modes) const enum rig_spectrum_mode_e *modes)
{ {