]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: fix front-end GMP memleaks
authorHarald Anlauf <anlauf@gmx.de>
Sun, 22 Dec 2024 20:34:19 +0000 (21:34 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Sun, 22 Dec 2024 20:34:19 +0000 (21:34 +0100)
gcc/fortran/ChangeLog:

* check.cc (gfc_check_random_seed): Clear gmp variables returned by
gfc_array_size.
* expr.cc (gfc_check_pointer_assign): Likewise.

gcc/fortran/check.cc
gcc/fortran/expr.cc

index f10e665088df139909761475bc76f2b8ef5ee2f1..f4fde83e8ab57f8b8bafe938ef04118f2228da6a 100644 (file)
@@ -7155,12 +7155,16 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get)
       if (!kind_value_check (put, 1, gfc_default_integer_kind))
        return false;
 
-      if (gfc_array_size (put, &put_size)
-         && mpz_get_ui (put_size) < seed_size)
-       gfc_error ("Size of %qs argument of %qs intrinsic at %L "
-                  "too small (%i/%i)",
-                  gfc_current_intrinsic_arg[1]->name, gfc_current_intrinsic,
-                  &put->where, (int) mpz_get_ui (put_size), seed_size);
+      if (gfc_array_size (put, &put_size))
+       {
+         if (mpz_get_ui (put_size) < seed_size)
+           gfc_error ("Size of %qs argument of %qs intrinsic at %L "
+                      "too small (%i/%i)",
+                      gfc_current_intrinsic_arg[1]->name,
+                      gfc_current_intrinsic,
+                      &put->where, (int) mpz_get_ui (put_size), seed_size);
+         mpz_clear (put_size);
+       }
     }
 
   if (get != NULL)
@@ -7187,12 +7191,16 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get)
       if (!kind_value_check (get, 2, gfc_default_integer_kind))
        return false;
 
-       if (gfc_array_size (get, &get_size)
-          && mpz_get_ui (get_size) < seed_size)
-       gfc_error ("Size of %qs argument of %qs intrinsic at %L "
-                  "too small (%i/%i)",
-                  gfc_current_intrinsic_arg[2]->name, gfc_current_intrinsic,
-                  &get->where, (int) mpz_get_ui (get_size), seed_size);
+       if (gfc_array_size (get, &get_size))
+        {
+          if (mpz_get_ui (get_size) < seed_size)
+            gfc_error ("Size of %qs argument of %qs intrinsic at %L "
+                       "too small (%i/%i)",
+                       gfc_current_intrinsic_arg[2]->name,
+                       gfc_current_intrinsic,
+                       &get->where, (int) mpz_get_ui (get_size), seed_size);
+          mpz_clear (get_size);
+        }
     }
 
   /* RANDOM_SEED may not have more than one non-optional argument.  */
index a349d989d6c40c9c5b8159ea3250998734b62c09..dad383a1aa2b1d69dd92d3a61878b440d2d056f9 100644 (file)
@@ -4364,16 +4364,24 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
 
       /* If this can be determined, check that the target must be at least as
         large as the pointer assigned to it is.  */
-      if (gfc_array_size (lvalue, &lsize)
-         && gfc_array_size (rvalue, &rsize)
-         && mpz_cmp (rsize, lsize) < 0)
+      bool got_lsize = gfc_array_size (lvalue, &lsize);
+      bool got_rsize = got_lsize && gfc_array_size (rvalue, &rsize);
+      bool too_small = got_rsize && mpz_cmp (rsize, lsize) < 0;
+
+      if (too_small)
        {
          gfc_error ("Rank remapping target is smaller than size of the"
                     " pointer (%ld < %ld) at %L",
                     mpz_get_si (rsize), mpz_get_si (lsize),
                     &lvalue->where);
+         mpz_clear (lsize);
+         mpz_clear (rsize);
          return false;
        }
+      if (got_lsize)
+       mpz_clear (lsize);
+      if (got_rsize)
+       mpz_clear (rsize);
 
       /* An assumed rank target is an experimental F202y feature.  */
       if (rvalue->rank == -1 && !(gfc_option.allow_std & GFC_STD_F202Y))