Skip to content

Commit e0aac65

Browse files
committed
Merge branch 'asan-ubsan-fixes'
* asan-ubsan-fixes: GLUI: MorphCurveWidget: avoid reading past end for last curve segment LIB: math utils: avoid zero-size arrays on stack to avoid UB LIB: LiveDecoder: avoid reading from uninitialized data member, avoid UB LIB: FormantCorrection: avoid zero-size arrays on stack to avoid UB Signed-off-by: Stefan Westerfeld <[email protected]>
2 parents 7746da6 + dc87495 commit e0aac65

File tree

4 files changed

+11
-6
lines changed

4 files changed

+11
-6
lines changed

glui/smmorphcurvewidget.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,12 @@ MorphCurveWidget::find_closest_segment_index (const Point& p)
484484
{
485485
Point curve_p = curve_point_to_xy (m_curve.points[i]);
486486
if (curve_p.x() < p.x())
487-
index = i;
487+
{
488+
if (i + 1 < m_curve.points.size())
489+
index = i;
490+
else
491+
index = -1; // no valid segment: p is not between two curve points
492+
}
488493
}
489494
return index;
490495
}

lib/smformantcorrection.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ FormantCorrection::process_block (const AudioBlock& in_block, RTAudioBlock& out_
118118
assert (out_block.freqs.size() == mags_count);
119119
for (size_t i = 0; i < mags_count; i++)
120120
mags[i] *= norm;
121-
uint16_t imags[mags_count];
121+
uint16_t imags[mags_count + AVOID_ARRAY_UB];
122122
sm_factor2idbs (mags, mags_count, imags);
123123
out_block.mags.assign (imags, imags + mags_count);
124124
};
@@ -127,7 +127,7 @@ FormantCorrection::process_block (const AudioBlock& in_block, RTAudioBlock& out_
127127
{
128128
out_block.freqs.set_capacity (in_block.freqs.size());
129129
const float e_tune_factor = 1 / in_block.env_f0;
130-
float mags[in_block.freqs.size()];
130+
float mags[in_block.freqs.size() + AVOID_ARRAY_UB];
131131
size_t count = 0;
132132

133133
for (size_t i = 0; i < in_block.freqs.size(); i++)

lib/smlivedecoder.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class LiveDecoder
3030
float mag;
3131
uint phase;
3232
};
33-
std::vector<PartialState> pstate[2], *last_pstate;
33+
std::vector<PartialState> pstate[2], *last_pstate = &pstate[0];
3434

3535
WavSet *smset;
3636
Audio *audio;

lib/smmath.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ sm_idb2factor_slow (uint16_t idb)
4141
void
4242
sm_factor2idbs (float *factors, uint n_factors, uint16_t *out)
4343
{
44-
float tmp[n_factors];
44+
float tmp[n_factors + AVOID_ARRAY_UB];
4545
for (uint i = 0; i < n_factors; i++)
4646
tmp[i] = std::max (factors[i], 1e-25f);
4747

@@ -66,7 +66,7 @@ sm_freq2ifreq (float freq)
6666
void
6767
sm_freq2ifreqs (float *freqs, uint n_freqs, uint16_t *out)
6868
{
69-
float tmp[n_freqs];
69+
float tmp[n_freqs + AVOID_ARRAY_UB];
7070
for (uint i = 0; i < n_freqs; i++)
7171
tmp[i] = fast_log2 (freqs[i]); // compiler should auto vectorize this loop
7272

0 commit comments

Comments
 (0)