slackbuilds_ponce/system/pdksh/patches/001_upstream-readonly-vars.patch
2010-05-13 01:01:03 +02:00

172 lines
4.5 KiB
Diff

* 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 */