summaryrefslogtreecommitdiff
path: root/system/pdksh/patches/001_upstream-readonly-vars.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/pdksh/patches/001_upstream-readonly-vars.patch')
-rw-r--r--system/pdksh/patches/001_upstream-readonly-vars.patch172
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 */