0.9.0.28:
authorChristophe Rhodes <csr21@cam.ac.uk>
Thu, 12 May 2005 14:33:13 +0000 (14:33 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Thu, 12 May 2005 14:33:13 +0000 (14:33 +0000)
Fix for "fun with frameworks" SIGBUS bug.
... arg.  (argv[] specifically)

NEWS
src/runtime/runtime.c
version.lisp-expr

diff --git a/NEWS b/NEWS
index da81148..a7469ab 100644 (file)
--- 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
index 2aa0831..a457dd8 100644 (file)
@@ -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. */
index 84cdf6b..d1c3ff0 100644 (file)
@@ -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"