You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
4.8 KiB

# --- T2-COPYRIGHT-NOTE-BEGIN ---
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
#
# T2 SDE: 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.
# --- T2-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;
}