|
|
|
# --- 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|