[Rcpp-devel] FW: simple patch to fix stack overflow in RInside v. 2011-12-06 23:47:21

john brzustowski jbrzusto at fastmail.fm
Mon Jan 2 20:27:51 CET 2012


Hi Dirk,

On 2 January 2012 at 11:29, Dirk Eddelbuettel wrote:
>...
> On 2 January 2012 at 12:55, John Brzustowski wrote:
>...
> | Second, below is a small patch to fix a stack overflow under Windows.
> | The problem is that the myWriteConsole callback is recursively invoking itself
> | via Rprintf.  With this patch, the programs in examples/standard all run correctly.
> 
> I test them all pre-release on on XP 32bit and they worked for me.  What is
> your platform?

Windows 7 Home Edition, 64-bit.

> | =========================================
> | diff -r RInside/src/RInside.cpp RInside_patched/src/RInside.cpp
> | 72c72,73
> | <      Rprintf("%s", buf);
> | ---
> | >     fwrite(buf, sizeof(char), len, stdout);
> | >     fflush(stdout);
> 
> 
> I'll take another look when I am back in the office.  And maybe we could use
> strnprintf followed by Rprintf here...
>
> On which platforms are you seeing issues?

I'm compiling with (32-bit) Rtools 2.14 under MinGW, and using R
2.14.1 (32-bit).  This problem does not occur under Linux (ubuntu
11.10); my patch only affects code conditionally compiled for Win32.

I believe this is the same issue as Diomidis Spinellis is having.  When I first
compiled and ran the examples/standard programs, most would cause an abnormal
termination.  With gdb, the stack trace looked like this:

#0  0x6c976f42 in trio_strerror () from c:\R\R-2.14.1\bin\i386\R.dll
#1  0x6c94d526 in trio_vsnprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#2  0x6c770f72 in Rcons_vprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#3  0x6c7d04bc in R_tryEvalSilent () from c:\R\R-2.14.1\bin\i386\R.dll
#4  0x6c77104d in Rvprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#5  0x6c7710a8 in Rprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#6  0x6c770f90 in Rcons_vprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#7  0x6c7d04bc in R_tryEvalSilent () from c:\R\R-2.14.1\bin\i386\R.dll
#8  0x6c77104d in Rvprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#9  0x6c7710a8 in Rprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#10 0x6c770f90 in Rcons_vprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#11 0x6c7d04bc in R_tryEvalSilent () from c:\R\R-2.14.1\bin\i386\R.dll
#12 0x6c77104d in Rvprintf () from c:\R\R-2.14.1\bin\i386\R.dll
#13 0x6c7710a8 in Rprintf () from c:\R\R-2.14.1\bin\i386\R.dll
... (many repeats of previous 4 lines)
#986 0x6c770f90 in Rcons_vprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#987 0x6c7d04bc in R_tryEvalSilent () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#988 0x6c77104d in Rvprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#989 0x6c7710a8 in Rprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#990 0x6c770f90 in Rcons_vprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#991 0x6c7d04bc in R_tryEvalSilent () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#992 0x6c77104d in Rvprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#993 0x6c7710a8 in Rprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#994 0x6c83ae0c in Rf_formatComplex () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#995 0x6c79044e in R_CleanTempDir () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#996 0x6c79a601 in Rf_eval () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#997 0x6c79d8bc in Rf_applyClosure () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#998 0x6c79a8a3 in Rf_eval () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#999 0x6c7cc705 in R_RestoreGlobalEnvFromFile () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#1000 0x6c7cc838 in R_RestoreGlobalEnvFromFile () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#1001 0x6c7cdd15 in R_tryEval () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
#1002 0x00401bdb in ?? ()
#1003 0x02bcf764 in ?? ()
#1004 0x00000000 in ?? ()

After re-compiling RInside from source with debugging enabled, the new
stack trace showed that Rprintf was indirectly invoking itself via the
myWriteConsole() function in file RInside.cpp (sorry, I don't have
that stack trace handy).  The termination appeared due to a stack
overflow, and I wrote the patch on that assumption.  It seems that one
can't call a high level R print function (Rprintf) from inside a
console callback, but I haven't had time to verify this.

Cheers,

John B.
#-------------------------------------------------------------------------------
#  John Brzustowski
#  14 Hillcrest Ave., Wolfville, NS  B4P 1T4 Canada


More information about the Rcpp-devel mailing list