Jakub Jelinek wrote:

There is a bug in _gfortran_s{max,min}loc1_{4,8,16}_s{1,4} which the
following testcase shows.
The functions return but then crash in the caller.

Seems that is because buffer overflows, I believe those functions for
if (mask == NULL || *mask) condition being false are supposed to fill in
the result array with all zeros (or allocate it and fill it with zeros).
My understanding is the result array in that case is integer(kind={4,8,16})
and should have the extents the character input array has.

The problem is that it uses * string_len in the extent multiplication:
       extent[n] = GFC_DESCRIPTOR_EXTENT(array,n) * string_len;
and
       extent[n] =
         GFC_DESCRIPTOR_EXTENT(array,n + 1) * string_len;
which is I guess fine and desirable for the extents of the character array,
but not for the extents of the destination array.  Yet the code uses
that extent array for that purpose (and no other purposes).
...
Tested on x86_64-linux and i686-linux, ok for trunk?

LGTM. Thanks for the patch!

Tobias

2025-05-12  Jakub Jelinek  <ja...@redhat.com>

        PR fortran/120191
        * m4/ifunction-s.m4 (SCALAR_ARRAY_FUNCTION): Don't multiply
        GFC_DESCRIPTOR_EXTENT(array,) by string_len.
        * generated/maxloc1_4_s1.c: Regenerate.
        * generated/maxloc1_4_s4.c: Regenerate.
        * generated/maxloc1_8_s1.c: Regenerate.
        * generated/maxloc1_8_s4.c: Regenerate.
        * generated/maxloc1_16_s1.c: Regenerate.
        * generated/maxloc1_16_s4.c: Regenerate.
        * generated/minloc1_4_s1.c: Regenerate.
        * generated/minloc1_4_s4.c: Regenerate.
        * generated/minloc1_8_s1.c: Regenerate.
        * generated/minloc1_8_s4.c: Regenerate.
        * generated/minloc1_16_s1.c: Regenerate.
        * generated/minloc1_16_s4.c: Regenerate.

        * gfortran.dg/pr120191_3.f90: New test.

Reply via email to