Jeroen Demeyer on Wed, 10 Jun 2015 11:28:11 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Collect garbage in qfgaussred()


Hello,

While using qfgaussred(), I noticed that it can easily overflow the stack for moderate input. This is because there is no gerepile...() in the main loop. I attach a trivial patch to fix this.

Cheers,
Jeroen.
commit c19b216495708e219b9216b36101ed6c3b493892
Author: Jeroen Demeyer <jdemeyer@cage.ugent.be>
Date:   Wed Jun 10 11:15:05 2015 +0200

    Collect garbage in qfgaussred()

diff --git a/src/basemath/alglin2.c b/src/basemath/alglin2.c
index 3878f79..09cd1f0 100644
--- a/src/basemath/alglin2.c
+++ b/src/basemath/alglin2.c
@@ -1523,6 +1523,11 @@ gaussred(GEN a, long signature)
           gcoeff(a,i,j) = gsub(gcoeff(a,i,j), gmul(c,gcoeff(a,k,j)));
       }
       gcoeff(a,k,k) = p;
+      if (gc_needed(av1,1))
+      {
+        if(DEBUGMEM>1) pari_warn(warnmem,"gaussred (t = %ld)", t);
+        a = gerepilecopy(av1, a);
+      }
     }
     else
     { /* all remaining diagonal coeffs are currently 0 */