Fixes init script loading
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 22 Jul 2014 05:32:35 +0000 (22:32 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 22 Jul 2014 05:32:35 +0000 (22:32 -0700)
We were starting with the script string, which is a kernel address, and
then running off the end of it, replaces spaces with \0s for a while.
With crazy results.  The monitor prompt was missing some letters,
probably because we clobbered them, etc.  Also, if you return -1 before
calling mon_bin_run, the kernel would just PF, and then GPF on its BT.
yikes!  We might have been clobbering more stuff too, like running off
the end of largv.

This newer version still works, and doesn't have those bugs.  But it
might have more.  We should consider rewriting it with parsecmd() or
something.  That'd also get rid of the need for the two loops of
parsing.

kern/src/init.c

index dfe5375..5e39deb 100644 (file)
@@ -126,6 +126,7 @@ static int run_init_script(void)
                char *sptr = &CONFIG_INIT_SCRIPT_PATH_AND_ARGS[0];
 
                /* Figure out how many arguments there are, by finding the spaces */
+               /* TODO: consider rewriting this stuff with parsecmd */
                while (*sptr != '\0') {
                        if (*(sptr++) != ' ') {
                                vargs++;
@@ -148,11 +149,12 @@ static int run_init_script(void)
                sptr = &CONFIG_INIT_SCRIPT_PATH_AND_ARGS[0];
                while (*sptr != '\0') {
                        if (*sptr != ' ') {
-                               char *sbeg = sptr;
+                               l_argv[i++] = sptr;
                                while ((*sptr != ' ') && (*sptr != '\0'))
                                        sptr++;
+                               if (*sptr == '\0')
+                                       break;
                                *sptr = '\0';
-                               l_argv[i++] = sbeg;
                        }
                        sptr++;
                }