| Jeroen Demeyer on Wed, 18 Jan 2017 15:33:00 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Use PROT_NONE for unused virtual stack memory |
The fix is easy: reset avma when calling parivstack_reset(). I also made it an error to call parivstack_reset() when avma is below the new bottom of the stack. This will help to catch similar errors.
Patch attached... Cheers, Jeroen.
>From dc1d20081d09280f18820b565b80509f6e6c326e Mon Sep 17 00:00:00 2001
From: Jeroen Demeyer <jdemeyer@cage.ugent.be>
Date: Wed, 18 Jan 2017 13:45:39 +0000
Subject: [PATCH] Reset avma before calling parivstack_reset
---
doc/usersch5.tex | 9 ++++++---
src/gp/gp.c | 2 +-
src/language/init.c | 2 ++
3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/doc/usersch5.tex b/doc/usersch5.tex
index 58c7d04..6dc868c 100644
--- a/doc/usersch5.tex
+++ b/doc/usersch5.tex
@@ -193,9 +193,12 @@ at most \kbd{parisizemax}. The stack content is not affected
by this operation.
\fun{void}{parivstack_reset}{void}
-resets the current stack to its default size \kbd{parisize},
-destroying its content. Used to recover memory after a
-computation that enlarged the stack.
+resets the current stack to its default size \kbd{parisize}. This is
+used to recover memory after a computation that enlarged the stack.
+This function destroys the content of the enlarged stack (between
+the old and the new bottom of the stack).
+Before calling this function, you must ensure that \kbd{avma} lies
+within the new smaller stack.
\fun{void}{paristack_newrsize}{ulong newsize}
\emph{(does not return)}. Library version of
diff --git a/src/gp/gp.c b/src/gp/gp.c
index deaeec7..3463a2d 100644
--- a/src/gp/gp.c
+++ b/src/gp/gp.c
@@ -360,7 +360,6 @@ gp_main_loop(long ismain)
if (ismain) continue;
pop_buffer(); return z;
}
- avma = av;
if (ismain)
{
reset_ctrlc();
@@ -384,6 +383,7 @@ gp_main_loop(long ismain)
if (GP_DATA->simplify) z = simplify_shallow(z);
pari_add_hist(z, t);
if (z != gnil && ! is_silent(b->buf) ) gp_output(z);
+ avma = av;
parivstack_reset();
}
}
diff --git a/src/language/init.c b/src/language/init.c
index 64783be..6c69c8e 100644
--- a/src/language/init.c
+++ b/src/language/init.c
@@ -786,6 +786,8 @@ void
parivstack_reset(void)
{
pari_mainstack_setsize(pari_mainstack, pari_mainstack->rsize);
+ if (avma < pari_mainstack->bot)
+ pari_err_BUG("parivstack_reset [avma < bot]");
}
/* Enlarge the stack if needed such that the unused portion of the stack
--
2.7.3