java-topology/defects/octave/patch/octave-0001-vecdim-binary-search.patch

35 lines
1.7 KiB
Diff

# UNDF: UNDF-2026-000000190
diff --git a/libinterp/corefcn/data.cc b/libinterp/corefcn/data.cc
index a1b2c3d..d4e5f6a 100644
--- a/libinterp/corefcn/data.cc
+++ b/libinterp/corefcn/data.cc
@@ -133,9 +133,10 @@ parse_vecdim_arg (const octave_value &dimarg, const Array<octave_value> &arg,
// Add remaining dims to permutation vector
for (int i = 0; i < ndims; i++)
{
- if (std::find (vecdim.begin (), vecdim.end (), i)
- == vecdim.end ())
+ // CWE-407 fix: vecdim is already sorted (std::sort above);
+ // std::find ignores the sort and is O(|vecdim|) per iteration.
+ // std::binary_search is O(log |vecdim|).
+ if (!std::binary_search (vecdim.begin (), vecdim.end (), i))
{
perm_vec(idx) = i;
new_sz(idx) = sz(i);
diff --git a/libinterp/corefcn/numeric/max.cc b/libinterp/corefcn/numeric/max.cc
index b2c3d4e..e5f6a7b 100644
--- a/libinterp/corefcn/numeric/max.cc
+++ b/libinterp/corefcn/numeric/max.cc
@@ -106,9 +106,10 @@ do_minmax_nd (const octave_value& arg, int dim, bool ismin,
// Add remaining dims to permutation vector
for (int i = 0; i < ndims; i++)
{
- if (std::find (vecdim.begin (), vecdim.end (), i)
- == vecdim.end ())
+ // CWE-407 fix: vecdim is already sorted (std::sort above);
+ // std::find ignores the sort and is O(|vecdim|) per iteration.
+ // std::binary_search is O(log |vecdim|).
+ if (!std::binary_search (vecdim.begin (), vecdim.end (), i))
{
perm_vec(idx) = i;
new_sz(idx) = sz(i);