Don't try to process short spectrum frames.

pull/1752/head
George Baltz N3GB 2025-05-31 14:10:05 -04:00
rodzic 7fa0c863f2
commit 6b5c5b48f9
1 zmienionych plików z 19 dodań i 9 usunięć

Wyświetl plik

@ -9016,7 +9016,6 @@ int icom_mW2power(RIG *rig, float *power, unsigned int mwpower, freq_t freq,
RETURNFUNC(RIG_OK); RETURNFUNC(RIG_OK);
} }
#if defined(HAVE_PTHREAD) #if defined(HAVE_PTHREAD)
static int icom_parse_spectrum_frame(RIG *rig, size_t length, static int icom_parse_spectrum_frame(RIG *rig, size_t length,
const unsigned char *frame_data) const unsigned char *frame_data)
@ -9025,15 +9024,20 @@ static int icom_parse_spectrum_frame(RIG *rig, size_t length,
struct icom_priv_caps *priv_caps = (struct icom_priv_caps *) caps->priv; struct icom_priv_caps *priv_caps = (struct icom_priv_caps *) caps->priv;
struct icom_priv_data *priv = (struct icom_priv_data *) STATE(rig)->priv; struct icom_priv_data *priv = (struct icom_priv_data *) STATE(rig)->priv;
struct icom_spectrum_scope_cache *cache; struct icom_spectrum_scope_cache *cache;
int division, max_division;
int division = (int) from_bcd(frame_data + 1, 1 * 2);
int max_division = (int) from_bcd(frame_data + 2, 1 * 2);
size_t spectrum_data_length_in_frame; size_t spectrum_data_length_in_frame;
const unsigned char *spectrum_data_start_in_frame; const unsigned char *spectrum_data_start_in_frame;
ENTERFUNC; ENTERFUNC;
if (length < 3)
{
rig_debug(RIG_DEBUG_WARN, "%s: Short scope data - len=%zu\n", __func__, length);
RETURNFUNC(-RIG_EPROTO);
}
division = (int) from_bcd(frame_data + 1, 1 * 2);
max_division = (int) from_bcd(frame_data + 2, 1 * 2);
// The first byte indicates spectrum scope ID/VFO: 0 = Main, 1 = Sub // The first byte indicates spectrum scope ID/VFO: 0 = Main, 1 = Sub
int spectrum_id = frame_data[0]; int spectrum_id = frame_data[0];
@ -9048,9 +9052,17 @@ static int icom_parse_spectrum_frame(RIG *rig, size_t length,
if (division == 1) if (division == 1)
{ {
int spectrum_scope_mode = frame_data[3]; int spectrum_scope_mode;
int out_of_range = frame_data[14]; int out_of_range;
if (length < 15)
{
rig_debug(RIG_DEBUG_WARN, "%s: Short scope header - len=%zu\n", __func__, length);
RETURNFUNC(-RIG_EPROTO);
}
spectrum_scope_mode = frame_data[3];
out_of_range = frame_data[14];
cache->spectrum_mode = RIG_SPECTRUM_MODE_NONE; cache->spectrum_mode = RIG_SPECTRUM_MODE_NONE;
switch (spectrum_scope_mode) switch (spectrum_scope_mode)
@ -9155,9 +9167,7 @@ static int icom_parse_spectrum_frame(RIG *rig, size_t length,
.spectrum_data = cache->spectrum_data, .spectrum_data = cache->spectrum_data,
}; };
#if defined(HAVE_PTHREAD)
rig_fire_spectrum_event(rig, &spectrum_line); rig_fire_spectrum_event(rig, &spectrum_line);
#endif
cache->spectrum_metadata_valid = 0; cache->spectrum_metadata_valid = 0;
} }