|
|
# --- SDE-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # Filename: package/.../pdksh/pdksh-5.2.14-1.patch # Copyright (C) 2004 - 2006 The T2 SDE Project # Copyright (C) 1998 - 2003 Clifford Wolf # # More information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # --- SDE-COPYRIGHT-NOTE-END ---
[ ftp://ftp.cs.mun.ca/pub/pdksh/pdksh-5.2.14-patches.1 ]
Here are patches for 3 significant bugs in pdksh-5.2.14: - set -x dumps core (shf.c); - output of "jobs" command is filled with ^A characters (jobs.c); - "typeset -r foo=bar" fails saying foo is readonly (var.c).
--- ./shf.c
+++ ./shf.c
@@ -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;
--- ./var.c
+++ ./var.c
@@ -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 */
--- ./jobs.c
+++ ./jobs.c
@@ -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;
}
|