diff options
Diffstat (limited to 'system/pdksh/patches/001_upstream-readonly-vars.patch')
-rw-r--r-- | system/pdksh/patches/001_upstream-readonly-vars.patch | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/system/pdksh/patches/001_upstream-readonly-vars.patch b/system/pdksh/patches/001_upstream-readonly-vars.patch new file mode 100644 index 0000000000..616a5102d9 --- /dev/null +++ b/system/pdksh/patches/001_upstream-readonly-vars.patch @@ -0,0 +1,172 @@ + * Applied patch from upstream ftp site to fix problem with readonly + variables (closes: #57727). +Index: pdksh-5.2.14/jobs.c +=================================================================== +--- pdksh-5.2.14.orig/jobs.c 2008-04-15 20:47:52.000000000 +0200 ++++ pdksh-5.2.14/jobs.c 2008-04-15 20:48:46.000000000 +0200 +@@ -219,8 +219,7 @@ + static void check_job ARGS((Job *j)); + static void put_job ARGS((Job *j, int where)); + static void remove_job ARGS((Job *j, const char *where)); +-static void kill_job ARGS((Job *j)); +-static void fill_command ARGS((char *c, int len, struct op *t)); ++static int kill_job ARGS((Job *j, int sig)); + + /* initialize job control */ + void +@@ -294,10 +293,17 @@ + && procpid == kshpid))))) + { + killed = 1; +- killpg(j->pgrp, SIGHUP); ++ if (j->pgrp == 0) ++ kill_job(j, SIGHUP); ++ else ++ killpg(j->pgrp, SIGHUP); + #ifdef JOBS +- if (j->state == PSTOPPED) +- killpg(j->pgrp, SIGCONT); ++ if (j->state == PSTOPPED) { ++ if (j->pgrp == 0) ++ kill_job(j, SIGCONT); ++ else ++ killpg(j->pgrp, SIGCONT); ++ } + #endif /* JOBS */ + } + } +@@ -497,7 +503,7 @@ + put_job(j, PJ_PAST_STOPPED); + } + +- fill_command(p->command, sizeof(p->command), t); ++ snptreef(p->command, sizeof(p->command), "%T", t); + + /* create child process */ + forksleep = 1; +@@ -508,7 +514,7 @@ + forksleep <<= 1; + } + if (i < 0) { +- kill_job(j); ++ kill_job(j, SIGKILL); + remove_job(j, "fork failed"); + #ifdef NEED_PGRP_SYNC + if (j_sync_open) { +@@ -823,11 +829,10 @@ + } + + if (j->pgrp == 0) { /* started when !Flag(FMONITOR) */ +- for (p=j->proc_list; p != (Proc *) 0; p = p->next) +- if (kill(p->pid, sig) < 0) { +- bi_errorf("%s: %s", cp, strerror(errno)); +- rv = 1; +- } ++ if (kill_job(j, sig) < 0) { ++ bi_errorf("%s: %s", cp, strerror(errno)); ++ rv = 1; ++ } + } else { + #ifdef JOBS + if (j->state == PSTOPPED && (sig == SIGTERM || sig == SIGHUP)) +@@ -1825,50 +1830,17 @@ + * + * If jobs are compiled in then this routine expects sigchld to be blocked. + */ +-static void +-kill_job(j) ++static int ++kill_job(j, sig) + Job *j; ++ int sig; + { + Proc *p; ++ int rval = 0; + + for (p = j->proc_list; p != (Proc *) 0; p = p->next) + if (p->pid != 0) +- (void) kill(p->pid, SIGKILL); +-} +- +-/* put a more useful name on a process than snptreef does (in certain cases) */ +-static void +-fill_command(c, len, t) +- char *c; +- int len; +- struct op *t; +-{ +- int alen; +- char **ap; +- +- if (t->type == TEXEC || t->type == TCOM) { +- /* Causes problems when set -u is in effect, can also +- cause problems when array indices evaluated (may have +- side effects, eg, assignment, incr, etc.) +- if (t->type == TCOM) +- ap = eval(t->args, DOBLANK|DONTRUNCOMMAND); +- else +- */ +- ap = t->args; +- --len; /* save room for the null */ +- while (len > 0 && *ap != (char *) 0) { +- alen = strlen(*ap); +- if (alen > len) +- alen = len; +- memcpy(c, *ap, alen); +- c += alen; +- len -= alen; +- if (len > 0) { +- *c++ = ' '; len--; +- } +- ap++; +- } +- *c = '\0'; +- } else +- snptreef(c, len, "%T", t); ++ if (kill(p->pid, sig) < 0) ++ rval = -1; ++ return rval; + } +Index: pdksh-5.2.14/shf.c +=================================================================== +--- pdksh-5.2.14.orig/shf.c 2008-04-15 20:47:52.000000000 +0200 ++++ pdksh-5.2.14/shf.c 2008-04-15 20:48:46.000000000 +0200 +@@ -355,7 +355,6 @@ + shf->rp = nbuf + (shf->rp - shf->buf); + shf->wp = nbuf + (shf->wp - shf->buf); + shf->rbsize += shf->wbsize; +- shf->wbsize += shf->wbsize; + shf->wnleft += shf->wbsize; + shf->wbsize *= 2; + shf->buf = nbuf; +Index: pdksh-5.2.14/var.c +=================================================================== +--- pdksh-5.2.14.orig/var.c 2008-04-15 20:47:52.000000000 +0200 ++++ pdksh-5.2.14/var.c 2008-04-15 20:48:46.000000000 +0200 +@@ -353,7 +353,9 @@ + const char *s; + int error_ok; + { +- if (vq->flag & RDONLY) { ++ int no_ro_check = error_ok & 0x4; ++ error_ok &= ~0x4; ++ if ((vq->flag & RDONLY) && !no_ro_check) { + warningf(TRUE, "%s: is read only", vq->name); + if (!error_ok) + errorf(null); +@@ -715,13 +717,13 @@ + if (val != NULL) { + if (vp->flag&INTEGER) { + /* do not zero base before assignment */ +- setstr(vp, val, KSH_UNWIND_ERROR); ++ setstr(vp, val, KSH_UNWIND_ERROR | 0x4); + /* Done after assignment to override default */ + if (base > 0) + vp->type = base; + } else + /* setstr can't fail (readonly check already done) */ +- setstr(vp, val, KSH_RETURN_ERROR); ++ setstr(vp, val, KSH_RETURN_ERROR | 0x4); + } + + /* only x[0] is ever exported, so use vpbase */ |