From baf5f781af1b88919b929c33e06f235f84e4cfb4 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 12 May 2005 14:33:13 +0000 Subject: [PATCH] 0.9.0.28: Fix for "fun with frameworks" SIGBUS bug. ... arg. (argv[] specifically) --- NEWS | 3 +++ src/runtime/runtime.c | 13 +++++++++---- version.lisp-expr | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index da81148..a7469ab 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,9 @@ changes in sbcl-0.9.1 relative to sbcl-0.9.0: combination method is not signalled until the faulty method is called. * bug fix: iteration variable type inferrer failed to deal with open intervals. (reported by Alan Shields) + * bug fix: dynamically loading (via LOAD-SHARED-OBJECT or similar) + "frameworks" on Mac OS X no longer causes an EXC_BAD_ACCESS if two + or more runtime options were provided to the sbcl binary. * compiled code is not steppable if COMPILATION-SPEED >= DEBUG. * contrib improvement: implement SB-POSIX:MKSTEMP (Yannick Gingras) * optimization: There's now a fast-path for fixnum arguments in the diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 2aa0831..a457dd8 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -183,6 +183,7 @@ main(int argc, char *argv[], char *envp[]) /* the name of the core file we're to execute. Note that this is * a malloc'ed string which should be freed eventually. */ char *core = 0; + char **sbcl_argv = 0; /* other command line options */ boolean noinform = 0; @@ -248,6 +249,10 @@ main(int argc, char *argv[], char *envp[]) { char *argi0 = argv[argi]; int argj = 1; + /* (argc - argi) for the arguments, one for the binary, + and one for the terminating NULL. */ + sbcl_argv = successful_malloc((2 + argc - argi) * sizeof(char *)); + sbcl_argv[0] = argv[0]; while (argi < argc) { char *arg = argv[argi++]; /* If we encounter --end-runtime-options for the first @@ -259,10 +264,9 @@ main(int argc, char *argv[], char *envp[]) 0 == strcmp(arg, "--end-runtime-options")) { lose("bad runtime option \"%s\"", argi0); } - argv[argj++] = arg; + sbcl_argv[argj++] = arg; } - argv[argj] = 0; - argc = argj; + sbcl_argv[argj] = 0; } } @@ -330,7 +334,8 @@ main(int argc, char *argv[], char *envp[]) /* Convert remaining argv values to something that Lisp can grok. */ SHOW("setting POSIX-ARGV symbol value"); - SetSymbolValue(POSIX_ARGV, alloc_base_string_list(argv),0); + SetSymbolValue(POSIX_ARGV, alloc_base_string_list(sbcl_argv),0); + free(sbcl_argv); /* Install a handler to pick off SIGINT until the Lisp system gets * far enough along to install its own handler. */ diff --git a/version.lisp-expr b/version.lisp-expr index 84cdf6b..d1c3ff0 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.9.0.27" +"0.9.0.28" -- 1.7.10.4