Applied patch from Larry Doolittle to fix '>\na\n' bug. Should close bug #1132
authorMark Whitley <markw@lineo.com>
Wed, 14 Mar 2001 17:26:37 +0000 (17:26 -0000)
committerMark Whitley <markw@lineo.com>
Wed, 14 Mar 2001 17:26:37 +0000 (17:26 -0000)
lash.c
sh.c
shell/lash.c

diff --git a/lash.c b/lash.c
index 3c52e2a28d08a81e3fdc7556ecc4cac28cf22cb0..8edb783694556932c67a87699473a2221ec4bb05 100644 (file)
--- a/lash.c
+++ b/lash.c
@@ -669,17 +669,22 @@ static void close_all()
 static void free_job(struct job *cmd)
 {
        int i;
+       struct jobset *keep;
 
        for (i = 0; i < cmd->num_progs; i++) {
                free(cmd->progs[i].argv);
                if (cmd->progs[i].redirects)
                        free(cmd->progs[i].redirects);
        }
-       free(cmd->progs);
+       if (cmd->progs)
+               free(cmd->progs);
        if (cmd->text)
                free(cmd->text);
-       free(cmd->cmdbuf);
+       if (cmd->cmdbuf)
+               free(cmd->cmdbuf);
+       keep = cmd->job_list;
        memset(cmd, 0, sizeof(struct job));
+       cmd->job_list = keep;
 }
 
 /* remove a job from the job_list */
@@ -1296,7 +1301,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                        chptr++;
 
                                if (!*chptr) {
-                                       error_msg("file name expected after %c", *src);
+                                       error_msg("file name expected after %c", *(src-1));
                                        free_job(job);
                                        job->num_progs=0;
                                        return 1;
diff --git a/sh.c b/sh.c
index 3c52e2a28d08a81e3fdc7556ecc4cac28cf22cb0..8edb783694556932c67a87699473a2221ec4bb05 100644 (file)
--- a/sh.c
+++ b/sh.c
@@ -669,17 +669,22 @@ static void close_all()
 static void free_job(struct job *cmd)
 {
        int i;
+       struct jobset *keep;
 
        for (i = 0; i < cmd->num_progs; i++) {
                free(cmd->progs[i].argv);
                if (cmd->progs[i].redirects)
                        free(cmd->progs[i].redirects);
        }
-       free(cmd->progs);
+       if (cmd->progs)
+               free(cmd->progs);
        if (cmd->text)
                free(cmd->text);
-       free(cmd->cmdbuf);
+       if (cmd->cmdbuf)
+               free(cmd->cmdbuf);
+       keep = cmd->job_list;
        memset(cmd, 0, sizeof(struct job));
+       cmd->job_list = keep;
 }
 
 /* remove a job from the job_list */
@@ -1296,7 +1301,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                        chptr++;
 
                                if (!*chptr) {
-                                       error_msg("file name expected after %c", *src);
+                                       error_msg("file name expected after %c", *(src-1));
                                        free_job(job);
                                        job->num_progs=0;
                                        return 1;
index 3c52e2a28d08a81e3fdc7556ecc4cac28cf22cb0..8edb783694556932c67a87699473a2221ec4bb05 100644 (file)
@@ -669,17 +669,22 @@ static void close_all()
 static void free_job(struct job *cmd)
 {
        int i;
+       struct jobset *keep;
 
        for (i = 0; i < cmd->num_progs; i++) {
                free(cmd->progs[i].argv);
                if (cmd->progs[i].redirects)
                        free(cmd->progs[i].redirects);
        }
-       free(cmd->progs);
+       if (cmd->progs)
+               free(cmd->progs);
        if (cmd->text)
                free(cmd->text);
-       free(cmd->cmdbuf);
+       if (cmd->cmdbuf)
+               free(cmd->cmdbuf);
+       keep = cmd->job_list;
        memset(cmd, 0, sizeof(struct job));
+       cmd->job_list = keep;
 }
 
 /* remove a job from the job_list */
@@ -1296,7 +1301,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
                                        chptr++;
 
                                if (!*chptr) {
-                                       error_msg("file name expected after %c", *src);
+                                       error_msg("file name expected after %c", *(src-1));
                                        free_job(job);
                                        job->num_progs=0;
                                        return 1;