Author: fjoe
Date: Wed Nov 30 18:07:38 2011
New Revision: 228157
URL: http://svn.freebsd.org/changeset/base/228157

Log:
  - Fix segmentation fault when running "+command" when run with -jX -n due
  to Compat_RunCommand() being called with `cmd' that is not on the 
node->commands
  list
  - Make ellipsis ("..." command) handling consistent: check for "..." command
  in job make after variables expansion to match compat make behavior
  - Fix empty command handling (after variables expansion and @+- modifiers
  are processed): now empty commands are ignored in compat make and are not
  printed in job make case
  - Bump MAKE_VERSION to 5-2011-11-30-0

Modified:
  head/usr.bin/make/Makefile
  head/usr.bin/make/job.c

Modified: head/usr.bin/make/Makefile
==============================================================================
--- head/usr.bin/make/Makefile  Wed Nov 30 17:39:00 2011        (r228156)
+++ head/usr.bin/make/Makefile  Wed Nov 30 18:07:38 2011        (r228157)
@@ -10,7 +10,9 @@ SRCS= arch.c buf.c cond.c dir.c for.c ha
 
 NO_SHARED?=    YES
 
-CFLAGS+=-DMAKE_VERSION=\"5200408120\"
+# Version has the RYYYYMMDDX format, where R is from RELENG_<R>
+CFLAGS+=-DMAKE_VERSION=\"5201111300\"
+
 # There is no obvious performance improvement currently.
 # CFLAGS+=-DUSE_KQUEUE
 

Modified: head/usr.bin/make/job.c
==============================================================================
--- head/usr.bin/make/job.c     Wed Nov 30 17:39:00 2011        (r228156)
+++ head/usr.bin/make/job.c     Wed Nov 30 18:07:38 2011        (r228157)
@@ -381,7 +381,7 @@ static int JobStart(GNode *, int, Job *)
 static void JobDoOutput(Job *, Boolean);
 static void JobInterrupt(int, int);
 static void JobRestartJobs(void);
-static int Compat_RunCommand(char *, struct GNode *);
+static int Compat_RunCommand(LstNode *, struct GNode *);
 
 static GNode       *curTarg = NULL;
 static GNode       *ENDNode;
@@ -647,7 +647,7 @@ JobPassSig(int signo)
  *     numCommands is incremented if the command is actually printed.
  */
 static int
-JobPrintCommand(char *cmd, Job *job)
+JobPrintCommand(LstNode *cmdNode, Job *job)
 {
        Boolean noSpecials;     /* true if we shouldn't worry about
                                 * inserting special commands into
@@ -658,40 +658,30 @@ JobPrintCommand(char *cmd, Job *job)
                                 * off before printing the command
                                 * and need to turn it back on */
        const char *cmdTemplate;/* Template to use when printing the command */
-       char    *cmdStart;      /* Start of expanded command */
-       LstNode *cmdNode;       /* Node for replacing the command */
+       char    *cmd;           /* Expanded command */
 
        noSpecials = (noExecute && !(job->node->type & OP_MAKE));
 
-       if (strcmp(cmd, "...") == 0) {
-               job->node->type |= OP_SAVE_CMDS;
-               if ((job->flags & JOB_IGNDOTS) == 0) {
-                       job->tailCmds =
-                           Lst_Succ(Lst_Member(&job->node->commands, cmd));
-                       return (1);
-               }
-               return (0);
-       }
-
 #define        DBPRINTF(fmt, arg)                      \
        DEBUGF(JOB, (fmt, arg));                \
        fprintf(job->cmdFILE, fmt, arg);        \
        fflush(job->cmdFILE);
 
-       numCommands += 1;
-
        /*
         * For debugging, we replace each command with the result of expanding
         * the variables in the command.
         */
-       cmdNode = Lst_Member(&job->node->commands, cmd);
-
-       cmd = Buf_Peel(Var_Subst(cmd, job->node, FALSE));
-       cmdStart = cmd;
-
-       Lst_Replace(cmdNode, cmdStart);
-
-       cmdTemplate = "%s\n";
+       cmd = Buf_Peel(Var_Subst(Lst_Datum(cmdNode), job->node, FALSE));
+       if (strcmp(cmd, "...") == 0) {
+               free(cmd);
+               job->node->type |= OP_SAVE_CMDS;
+               if ((job->flags & JOB_IGNDOTS) == 0) {
+                       job->tailCmds = Lst_Succ(cmdNode);
+                       return (1);
+               }
+               return (0);
+       }
+       Lst_Replace(cmdNode, cmd);
 
        /*
         * Check for leading @', -' or +'s to control echoing, error checking,
@@ -715,7 +705,7 @@ JobPrintCommand(char *cmd, Job *job)
                                 * but this one needs to be - use compat mode
                                 * just for it.
                                 */
-                               Compat_RunCommand(cmd, job->node);
+                               Compat_RunCommand(cmdNode, job->node);
                                return (0);
                        }
                        break;
@@ -726,6 +716,16 @@ JobPrintCommand(char *cmd, Job *job)
        while (isspace((unsigned char)*cmd))
                cmd++;
 
+       /*
+        * Ignore empty commands
+        */
+       if (*cmd == '\0') {
+               return (0);
+       }
+
+       cmdTemplate = "%s\n";
+       numCommands += 1;
+
        if (shutUp) {
                if (!(job->flags & JOB_SILENT) && !noSpecials &&
                    commandShell->hasEchoCtl) {
@@ -1665,7 +1665,7 @@ JobStart(GNode *gn, int flags, Job *prev
                                    Lst_Succ(gn->compat_command);
 
                        if (gn->compat_command == NULL ||
-                           JobPrintCommand(Lst_Datum(gn->compat_command), job))
+                           JobPrintCommand(gn->compat_command, job))
                                noExec = TRUE;
 
                        if (noExec && !(job->flags & JOB_FIRST)) {
@@ -1689,7 +1689,7 @@ JobStart(GNode *gn, int flags, Job *prev
                         */
                        numCommands = 0;
                        LST_FOREACH(ln, &gn->commands) {
-                               if (JobPrintCommand(Lst_Datum(ln), job))
+                               if (JobPrintCommand(ln, job))
                                        break;
                        }
 
@@ -1723,7 +1723,7 @@ JobStart(GNode *gn, int flags, Job *prev
                 */
                if (cmdsOK) {
                        LST_FOREACH(ln, &gn->commands) {
-                               if (JobPrintCommand(Lst_Datum(ln), job))
+                               if (JobPrintCommand(ln, job))
                                        break;
                        }
                }
@@ -2809,7 +2809,7 @@ CompatInterrupt(int signo)
                gn = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
                if (gn != NULL) {
                        LST_FOREACH(ln, &gn->commands) {
-                               if (Compat_RunCommand(Lst_Datum(ln), gn))
+                               if (Compat_RunCommand(ln, gn))
                                        break;
                        }
                }
@@ -2884,16 +2884,15 @@ shellneed(ArgArray *aa, char *cmd)
  *     The node's 'made' field may be set to ERROR.
  */
 static int
-Compat_RunCommand(char *cmd, GNode *gn)
+Compat_RunCommand(LstNode *cmdNode, GNode *gn)
 {
        ArgArray        aa;
-       char            *cmdStart;      /* Start of expanded command */
+       char            *cmd;           /* Expanded command */
        Boolean         silent;         /* Don't print command */
        Boolean         doit;           /* Execute even in -n */
        Boolean         errCheck;       /* Check errors */
        int             reason;         /* Reason for child's death */
        int             status;         /* Description of child's death */
-       LstNode         *cmdNode;       /* Node where current cmd is located */
        char            **av;           /* Argument vector for thing to exec */
        ProcStuff       ps;
 
@@ -2901,31 +2900,16 @@ Compat_RunCommand(char *cmd, GNode *gn)
        errCheck = !(gn->type & OP_IGNORE);
        doit = FALSE;
 
-       cmdNode = Lst_Member(&gn->commands, cmd);
-       cmdStart = Buf_Peel(Var_Subst(cmd, gn, FALSE));
-
-       /*
-        * brk_string will return an argv with a NULL in av[0], thus causing
-        * execvp() to choke and die horribly. Besides, how can we execute a
-        * null command? In any case, we warn the user that the command
-        * expanded to nothing (is this the right thing to do?).
-        */
-       if (*cmdStart == '\0') {
-               free(cmdStart);
-               Error("%s expands to empty string", cmd);
-               return (0);
-       } else {
-               cmd = cmdStart;
-       }
-       Lst_Replace(cmdNode, cmdStart);
-
+       cmd = Buf_Peel(Var_Subst(Lst_Datum(cmdNode), gn, FALSE));
        if ((gn->type & OP_SAVE_CMDS) && (gn != ENDNode)) {
-               Lst_AtEnd(&ENDNode->commands, cmdStart);
+               Lst_AtEnd(&ENDNode->commands, cmd);
                return (0);
-       } else if (strcmp(cmdStart, "...") == 0) {
+       } else if (strcmp(cmd, "...") == 0) {
+               free(cmd);
                gn->type |= OP_SAVE_CMDS;
                return (0);
        }
+       Lst_Replace(cmdNode, cmd);
 
        while (*cmd == '@' || *cmd == '-' || *cmd == '+') {
                switch (*cmd) {
@@ -2949,6 +2933,13 @@ Compat_RunCommand(char *cmd, GNode *gn)
                cmd++;
 
        /*
+        * Ignore empty commands
+        */
+       if (*cmd == '\0') {
+               return (0);
+       }
+
+       /*
         * Print the command before echoing if we're not supposed to be quiet
         * for this one. We also print the command if -n given, but not if '+'.
         */
@@ -3022,7 +3013,8 @@ Compat_RunCommand(char *cmd, GNode *gn)
                 * therefore do not free it when debugging.
                 */
                if (!DEBUG(GRAPH2)) {
-                       free(cmdStart);
+                       free(Lst_Datum(cmdNode));
+                       Lst_Replace(cmdNode, NULL);
                }
 
                /*
@@ -3166,8 +3158,7 @@ Compat_Make(GNode *gn, GNode *pgn)
                        if (!touchFlag) {
                                curTarg = gn;
                                LST_FOREACH(ln, &gn->commands) {
-                                       if (Compat_RunCommand(Lst_Datum(ln),
-                                           gn))
+                                       if (Compat_RunCommand(ln, gn))
                                                break;
                                }
                                curTarg = NULL;
@@ -3345,7 +3336,7 @@ Compat_Run(Lst *targs)
                gn = Targ_FindNode(".BEGIN", TARG_NOCREATE);
                if (gn != NULL) {
                        LST_FOREACH(ln, &gn->commands) {
-                               if (Compat_RunCommand(Lst_Datum(ln), gn))
+                               if (Compat_RunCommand(ln, gn))
                                        break;
                        }
                        if (gn->made == ERROR) {
@@ -3386,7 +3377,7 @@ Compat_Run(Lst *targs)
         */
        if (makeErrors == 0) {
                LST_FOREACH(ln, &ENDNode->commands) {
-                       if (Compat_RunCommand(Lst_Datum(ln), ENDNode))
+                       if (Compat_RunCommand(ln, ENDNode))
                                break;
                }
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to