From 195a46a23e25a26e9ff270c80b1d05459d087831 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 9 Dec 2014 09:08:16 -0700 Subject: [PATCH] fix problem with truncated value printing and stack overflow A value-printing truncation discovered after a stack-overflow handle and return could go badly, because the truncation escape wasn't reset correctly after overflow handling (in contrast to truncation discovered during the overflow handling, which was handled correctly). Closes PR 14870 --- pkgs/racket-test/tests/racket/print.rktl | 12 ++++++++++++ racket/src/racket/src/print.c | 16 +++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pkgs/racket-test/tests/racket/print.rktl b/pkgs/racket-test/tests/racket/print.rktl index a05436cd28..7e00ad3f76 100644 --- a/pkgs/racket-test/tests/racket/print.rktl +++ b/pkgs/racket-test/tests/racket/print.rktl @@ -255,6 +255,18 @@ (test +inf.0 print-syntax-width)) ;; ---------------------------------------- +;; Try to provoke a stack overflow during printing of truncated +;; values, ensuring that the stack-overflow handling doesn't +;; interfere with the printer escape on truncation: + +(with-handlers ([void void]) + (let loop ([i 6013]) + (if (zero? i) + (break-thread) + (with-handlers ([void (lambda (x y) x)]) + (loop (sub1 i)))))) + +;; ---------------------------------------- (report-errs) diff --git a/racket/src/racket/src/print.c b/racket/src/racket/src/print.c index 1929acddde..03e0b2d324 100644 --- a/racket/src/racket/src/print.c +++ b/racket/src/racket/src/print.c @@ -1411,13 +1411,15 @@ static Scheme_Object *print_k(void) pp->print_escape = save; return scheme_void; } else { - return print(o, - p->ku.k.i1, - p->ku.k.i2, - ht, - mt, - pp) - ? scheme_true : scheme_false; + int r; + r = print(o, + p->ku.k.i1, + p->ku.k.i2, + ht, + mt, + pp); + pp->print_escape = save; + return r ? scheme_true : scheme_false; } } #endif