aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2021-12-13 20:50:19 +0100
committerHarald Anlauf <anlauf@gmx.de>2021-12-19 21:12:43 +0100
commit05640d5ca8a20929f30eef41baee3e4a8d85c898 (patch)
treed8ce8f8b79534d73e6a7ff0a0c415c4c6969ec10 /libgfortran
parent4f9ad140c6c2ca51b591f44f7579cc3b81356291 (diff)
downloadgcc-05640d5ca8a20929f30eef41baee3e4a8d85c898.zip
gcc-05640d5ca8a20929f30eef41baee3e4a8d85c898.tar.gz
gcc-05640d5ca8a20929f30eef41baee3e4a8d85c898.tar.bz2
Fortran: PACK intrinsic should not try to read from zero-sized array
libgfortran/ChangeLog: PR libfortran/103634 * intrinsics/pack_generic.c (pack_internal): Handle case when the array argument of PACK has one or more extents of size zero to avoid invalid reads. gcc/testsuite/ChangeLog: PR libfortran/103634 * gfortran.dg/intrinsic_pack_6.f90: New test. (cherry picked from commit 1c613165a55b212c59a83796b20a1d555e096504)
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/intrinsics/pack_generic.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/libgfortran/intrinsics/pack_generic.c b/libgfortran/intrinsics/pack_generic.c
index cad2fbb..15880e7 100644
--- a/libgfortran/intrinsics/pack_generic.c
+++ b/libgfortran/intrinsics/pack_generic.c
@@ -85,6 +85,7 @@ pack_internal (gfc_array_char *ret, const gfc_array_char *array,
index_type count[GFC_MAX_DIMENSIONS];
index_type extent[GFC_MAX_DIMENSIONS];
+ bool zero_sized;
index_type n;
index_type dim;
index_type nelem;
@@ -114,10 +115,13 @@ pack_internal (gfc_array_char *ret, const gfc_array_char *array,
else
runtime_error ("Funny sized logical array");
+ zero_sized = false;
for (n = 0; n < dim; n++)
{
count[n] = 0;
extent[n] = GFC_DESCRIPTOR_EXTENT(array,n);
+ if (extent[n] <= 0)
+ zero_sized = true;
sstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(array,n);
mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask,n);
}
@@ -126,6 +130,11 @@ pack_internal (gfc_array_char *ret, const gfc_array_char *array,
if (mstride[0] == 0)
mstride[0] = mask_kind;
+ if (zero_sized)
+ sptr = NULL;
+ else
+ sptr = array->base_addr;
+
if (ret->base_addr == NULL || unlikely (compile_options.bounds_check))
{
/* Count the elements, either for allocating memory or