SOURCES: pdksh-debian.patch - updated from debian
arekm
arekm at pld-linux.org
Wed Nov 8 09:07:26 CET 2006
Author: arekm Date: Wed Nov 8 08:07:26 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- updated from debian
---- Files affected:
SOURCES:
pdksh-debian.patch (1.3 -> 1.4)
---- Diffs:
================================================================
Index: SOURCES/pdksh-debian.patch
diff -u SOURCES/pdksh-debian.patch:1.3 SOURCES/pdksh-debian.patch:1.4
--- SOURCES/pdksh-debian.patch:1.3 Sun Apr 25 02:35:58 2004
+++ SOURCES/pdksh-debian.patch Wed Nov 8 09:07:21 2006
@@ -1,19 +1,12 @@
-diff -urN pdksh-5.2.14.org/Makefile.in pdksh-5.2.14/Makefile.in
---- pdksh-5.2.14.org/Makefile.in Mon Feb 26 12:16:47 2001
-+++ pdksh-5.2.14/Makefile.in Mon Feb 26 12:19:09 2001
-@@ -16,7 +16,7 @@
- LIBS = @LIBS@
-
- CPPFLAGS = @CPPFLAGS@
--CFLAGS = @CFLAGS@
-+CFLAGS = @CFLAGS@ -DDEBIAN
- LDSTATIC = @LDSTATIC@
- LDFLAGS = @LDFLAGS@
-
-diff -urN pdksh-5.2.14.org/alloc.c pdksh-5.2.14/alloc.c
---- pdksh-5.2.14.org/alloc.c Mon Feb 26 12:16:47 2001
-+++ pdksh-5.2.14/alloc.c Mon Feb 26 12:17:11 2001
-@@ -110,6 +110,13 @@
+--- pdksh-5.2.14.orig/alloc.c
++++ pdksh-5.2.14/alloc.c
+@@ -1,3 +1,5 @@
++#ifndef DEBIAN
++
+ /*
+ * area-based allocation built on malloc/free
+ */
+@@ -110,6 +112,13 @@
Block *block;
struct {int _;} junk; /* alignment */
double djunk; /* alignment */
@@ -27,10 +20,194 @@
};
struct Block {
-diff -urN pdksh-5.2.14.org/c_ksh.c pdksh-5.2.14/c_ksh.c
---- pdksh-5.2.14.org/c_ksh.c Mon Feb 26 12:16:47 2001
-+++ pdksh-5.2.14/c_ksh.c Mon Feb 26 12:17:11 2001
-@@ -1208,6 +1208,7 @@
+@@ -282,7 +291,9 @@
+ * working (as it assumes size < ICELLS means it is not
+ * a `large object').
+ */
+- if (oldcells > ICELLS && cells > ICELLS) {
++ if (oldcells > ICELLS && cells > ICELLS
++ && ((dp-2)->block->last == dp+oldcells) /* don't destroy blocks which have grown! */
++ ) {
+ Block *bp = (dp-2)->block;
+ Block *nbp;
+ /* Saved in case realloc fails.. */
+@@ -332,7 +343,7 @@
+ * (need to check that cells < ICELLS so we don't make an
+ * object a `large' - that would mess everything up).
+ */
+- if (dp && cells > oldcells && cells <= ICELLS) {
++ if (dp && cells > oldcells) {
+ Cell *fp, *fpp;
+ Block *bp = (dp-2)->block;
+ int need = cells - oldcells - NOBJECT_FIELDS;
+@@ -363,7 +374,7 @@
+ * it to malloc...)
+ * Note: this also handles cells == oldcells (a no-op).
+ */
+- if (dp && cells <= oldcells && oldcells <= ICELLS) {
++ if (dp && cells <= oldcells) {
+ int split;
+
+ split = oldcells - cells;
+@@ -411,7 +422,9 @@
+
+ /* If this is a large object, just free it up... */
+ /* Release object... */
+- if ((dp-1)->size > ICELLS) {
++ if ((dp-1)->size > ICELLS
++ && (bp->last == dp + (dp-1)->size) /* don't free non-free blocks which have grown! */
++ ) {
+ ablockfree(bp, ap);
+ ACHECK(ap);
+ return;
+@@ -774,3 +787,127 @@
+ # endif /* TEST_ALLOC */
+
+ #endif /* MEM_DEBUG */
++
++#else /* DEBIAN */ /* patch from OpenBSD */
++
++/* $OpenBSD: alloc.c,v 1.6 2003/08/05 20:52:27 millert Exp $ */
++/*
++ * Copyright (c) 2002 Marc Espie.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
++ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD
++ * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * area-based allocation built on malloc/free
++ */
++
++#include "sh.h"
++
++struct link {
++ struct link *prev;
++ struct link *next;
++};
++
++Area *
++ainit(Area *ap)
++{
++ ap->freelist = NULL;
++ return ap;
++}
++
++void
++afreeall(Area *ap)
++{
++ struct link *l, *l2;
++
++ for (l = ap->freelist; l != NULL; l = l2) {
++ l2 = l->next;
++ free(l);
++ }
++ ap->freelist = NULL;
++}
++
++#define L2P(l) ( (void *)(((char *)(l)) + sizeof(struct link)) )
++#define P2L(p) ( (struct link *)(((char *)(p)) - sizeof(struct link)) )
++
++void *
++alloc(size_t size, Area *ap)
++{
++ struct link *l;
++
++ l = malloc(size + sizeof(struct link));
++ if (l == NULL)
++ internal_errorf(1, "unable to allocate memory");
++ l->next = ap->freelist;
++ l->prev = NULL;
++ if (ap->freelist)
++ ap->freelist->prev = l;
++ ap->freelist = l;
++
++ return L2P(l);
++}
++
++void *
++aresize(void *ptr, size_t size, Area *ap)
++{
++ struct link *l, *l2, *lprev, *lnext;
++
++ if (ptr == NULL)
++ return alloc(size, ap);
++
++ l = P2L(ptr);
++ lprev = l->prev;
++ lnext = l->next;
++
++ l2 = realloc(l, size+sizeof(struct link));
++ if (l2 == NULL)
++ internal_errorf(1, "unable to allocate memory");
++ if (lprev)
++ lprev->next = l2;
++ else
++ ap->freelist = l2;
++ if (lnext)
++ lnext->prev = l2;
++
++ return L2P(l2);
++}
++
++void
++afree(void *ptr, Area *ap)
++{
++ struct link *l;
++
++ if (!ptr)
++ return;
++
++ l = P2L(ptr);
++
++ if (l->prev)
++ l->prev->next = l->next;
++ else
++ ap->freelist = l->next;
++ if (l->next)
++ l->next->prev = l->prev;
++
++ free(l);
++}
++#endif /* DEBIAN */
+--- pdksh-5.2.14.orig/c_ksh.c
++++ pdksh-5.2.14/c_ksh.c
+@@ -1110,13 +1110,14 @@
+ return 1;
+ }
+ wp += builtin_opt.optind;
+- if (!*wp)
++ if (!*wp) {
+ if (j_jobs((char *) 0, flag, nflag))
+ rv = 1;
+- else
++ } else {
+ for (; *wp; wp++)
+ if (j_jobs(*wp, flag, nflag))
+ rv = 1;
++ }
+ return rv;
+ }
+
+@@ -1208,6 +1209,7 @@
builtin_opt.optarg);
return 1;
}
@@ -38,9 +215,218 @@
case '?':
return 1;
}
-diff -urN pdksh-5.2.14.org/edit.c pdksh-5.2.14/edit.c
---- pdksh-5.2.14.org/edit.c Mon Feb 26 12:16:47 2001
-+++ pdksh-5.2.14/edit.c Mon Feb 26 12:17:11 2001
+--- pdksh-5.2.14.orig/c_sh.c
++++ pdksh-5.2.14/c_sh.c
+@@ -422,7 +422,8 @@
+ c_eval(wp)
+ char **wp;
+ {
+- register struct source *s;
++ register struct source *s,*olds=source;
++ int retval, errexitflagtmp;
+
+ if (ksh_getopt(wp, &builtin_opt, null) == '?')
+ return 1;
+@@ -455,8 +456,12 @@
+ */
+ exstat = subst_exstat;
+ }
+-
+- return shell(s, FALSE);
++ errexitflagtmp = Flag(FERREXIT);
++ Flag(FERREXIT) = 0;
++ retval=shell(s, FALSE);
++ Flag(FERREXIT) = errexitflagtmp;
++ source=olds;
++ return retval;
+ }
+
+ int
+@@ -643,6 +648,7 @@
+ for (wp = l->argv; (*wp++ = *owp++) != NULL; )
+ ;
+ }
++#ifndef DEBIAN
+ /* POSIX says set exit status is 0, but old scripts that use
+ * getopt(1), use the construct: set -- `getopt ab:c "$@"`
+ * which assumes the exit value set will be that of the ``
+@@ -650,6 +656,12 @@
+ * if there are no command substitutions).
+ */
+ return Flag(FPOSIX) ? 0 : subst_exstat;
++#else
++ /* On Debian we always want set to return 0 like ksh93 does.
++ * See: Bug#118476.
++ */
++ return 0;
++#endif /* DEBIAN */
+ }
+
+ int
+@@ -844,7 +856,7 @@
+ * keeps them open).
+ */
+ #ifdef KSH
+- if (i > 2 && e->savefd[i])
++ if (!Flag(FSH) &&i > 2 && e->savefd[i])
+ fd_clexec(i);
+ #endif /* KSH */
+ }
+--- pdksh-5.2.14.orig/c_test.c
++++ pdksh-5.2.14/c_test.c
+@@ -124,10 +124,10 @@
+ te.pos.wp = wp + 1;
+ te.wp_end = wp + argc;
+
+- /*
++ /*
+ * Handle the special cases from POSIX.2, section 4.62.4.
+- * Implementation of all the rules isn't necessary since
+- * our parser does the right thing for the ommited steps.
++ * Implementation of all the rules isn't necessary since
++ * our parser does the right thing for the omitted steps.
+ */
+ if (argc <= 5) {
+ char **owp = wp;
+@@ -238,7 +238,7 @@
+ if (not)
+ res = !res;
+ }
+- return res;
++ return res;
+ case TO_FILRD: /* -r */
+ return test_eaccess(opnd1, R_OK) == 0;
+ case TO_FILWR: /* -w */
+@@ -338,7 +338,7 @@
+ case TO_FILUID: /* -O */
+ return test_stat(opnd1, &b1) == 0 && b1.st_uid == ksheuid;
+ case TO_FILGID: /* -G */
+- return test_stat(opnd1, &b1) == 0 && b1.st_gid == getegid();
++ return test_stat(opnd1, &b1) == 0 && b1.st_gid == kshegid;
+ /*
+ * Binary Operators
+ */
+@@ -456,10 +456,12 @@
+ }
+ #endif /* !HAVE_DEV_FD */
+
+- /* On most (all?) unixes, access() says everything is executable for
++ res = eaccess(path, mode);
++ /*
++ * On most (all?) unixes, access() says everything is executable for
+ * root - avoid this on files by using stat().
+ */
+- if ((mode & X_OK) && ksheuid == 0) {
++ if (res == 0 && ksheuid == 0 && (mode & X_OK)) {
+ struct stat statb;
+
+ if (stat(path, &statb) < 0)
+@@ -469,13 +471,7 @@
+ else
+ res = (statb.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH))
+ ? 0 : -1;
+- /* Need to check other permissions? If so, use access() as
+- * this will deal with root on NFS.
+- */
+- if (res == 0 && (mode & (R_OK|W_OK)))
+- res = eaccess(path, mode);
+- } else
+- res = eaccess(path, mode);
++ }
+
+ return res;
+ }
+@@ -660,3 +656,36 @@
+ else
+ bi_errorf("%s", msg);
+ }
++
++
++#ifdef DEBIAN
++int eaccess(const char *pathname, int mode) {
++ int need_setreuid, need_setregid;
++ int result;
++ int _errno;
++
++
++
++ if (( need_setregid = ( kshgid != kshegid ) )) {
++ setregid( kshegid, kshgid );
++ }
++
++ if (( need_setreuid = ( kshuid != ksheuid ) )) {
++ setreuid( ksheuid, kshuid );
++ }
++
++ result = access( pathname, mode );
++ _errno = errno;
++
++ if ( need_setregid ) {
++ setregid( kshgid, kshegid );
++ }
++
++ if ( need_setreuid ) {
++ setreuid( kshuid, ksheuid );
++ }
++
++ errno = _errno;
++ return result;
++}
++#endif
+--- pdksh-5.2.14.orig/c_ulimit.c
++++ pdksh-5.2.14/c_ulimit.c
+@@ -111,6 +111,9 @@
+ #ifdef RLIMIT_SWAP
+ { "swap(kbytes)", RLIMIT_SWAP, RLIMIT_SWAP, 1024, 'w' },
+ #endif
++#ifdef RLIMIT_LOCKS
++ { "flocks", RLIMIT, RLIMIT_LOCKS, RLIMIT_LOCKS, -1, 'L' },
++#endif
+ { (char *) 0 }
+ };
+ static char options[3 + NELEM(limits)];
+@@ -189,7 +192,18 @@
+ for (l = limits; l->name; l++) {
+ #ifdef HAVE_SETRLIMIT
+ if (l->which == RLIMIT) {
+- getrlimit(l->gcmd, &limit);
++ int getreturn;
++
++ getreturn=getrlimit(l->gcmd, &limit);
++#ifdef RLIMIT_LOCKS
++ if ( getreturn < 0 ) {
++ if ( ( errno == EINVAL ) &&
++ ( l->gcmd == RLIMIT_LOCKS ) ) {
++ limit.rlim_cur = RLIM_INFINITY;
++ limit.rlim_max = RLIM_INFINITY;
++ }
++ }
++#endif
+ if (how & SOFT)
+ val = limit.rlim_cur;
+ else if (how & HARD)
+@@ -225,11 +239,17 @@
+ if (how & HARD)
+ limit.rlim_max = val;
+ if (setrlimit(l->scmd, &limit) < 0) {
+- if (errno == EPERM)
++ if (errno == EPERM) {
+ bi_errorf("exceeds allowable limit");
+- else
++#ifdef RLIMIT_LOCKS
++ } else if ( ( errno == EINVAL ) &&
++ ( l->scmd == RLIMIT_LOCKS ) ) {
++ bi_errorf("unable to set it on the current kernel");
++#endif
++ } else {
+ bi_errorf("bad limit: %s",
+ strerror(errno));
++ }
+ return 1;
+ }
+ } else {
+--- pdksh-5.2.14.orig/edit.c
++++ pdksh-5.2.14/edit.c
@@ -15,6 +15,9 @@
# include <sys/stream.h> /* needed for <sys/ptem.h> */
# include <sys/ptem.h> /* needed for struct winsize */
@@ -86,7 +472,20 @@
/*
* Convert "foo*" (toglob) to an array of strings (words)
*/
-@@ -766,11 +789,23 @@
+@@ -722,7 +745,12 @@
+ return nwords;
+ }
+
++#ifndef DEBIAN
+ #define IS_WORDC(c) !(ctype(c, C_LEX1) || (c) == '\'' || (c) == '"')
++#else /* patch from OpenBSD */
++#define IS_WORDC(c) !( ctype(c, C_LEX1) || (c) == '\'' || (c) == '"' \
++ || (c) == '`' || (c) == '=' || (c) == ':' )
++#endif
+
+ static int
+ x_locate_word(buf, buflen, pos, startp, is_commandp)
+@@ -747,11 +775,23 @@
/* Keep going backwards to start of word (has effect of allowing
* one blank after the end of a word)
*/
@@ -103,14 +502,60 @@
;
+#else /* DEBIAN */ /* patch from OpenBSD */
+ for (end = start; end < buflen && IS_WORDC(buf[end]); end++) {
-+ if (buf[end] == '\\' && (end+1) < buflen && buf[end+1] == ' ')
++ if (buf[end] == '\\' && (end+1) < buflen)
+ end++;
+ }
+#endif /* DEBIAN */
if (is_commandp) {
int iscmd;
-@@ -1037,4 +1072,42 @@
+@@ -759,7 +799,11 @@
+ /* Figure out if this is a command */
+ for (p = start - 1; p >= 0 && isspace(buf[p]); p--)
+ ;
++#ifndef DEBIAN
+ iscmd = p < 0 || strchr(";|&()", buf[p]);
++#else /* DEBIAN */ /* patch from OpenBSD */
++ iscmd = p < 0 || strchr(";|&()`", buf[p]);
++#endif
+ if (iscmd) {
+ /* If command has a /, path, etc. is not searched;
+ * only current directory is searched, which is just
+@@ -961,6 +1005,9 @@
+ {
+ const char *sp, *p;
+ char *xp;
++#ifdef DEBIAN /* patch from OpenBSD */
++ int staterr;
++#endif /* DEBIAN */
+ int pathlen;
+ int patlen;
+ int oldsize, newsize, i, j;
+@@ -995,13 +1042,23 @@
+ memcpy(xp, pat, patlen);
+
+ oldsize = XPsize(*wp);
++#ifndef DEBIAN
+ glob_str(Xstring(xs, xp), wp, 0);
++#else /* DEBIAN */ /* patch from OpenBSD */
++ glob_str(Xstring(xs, xp), wp, 1); /* mark dirs */
++#endif
+ newsize = XPsize(*wp);
+
+ /* Check that each match is executable... */
+ words = (char **) XPptrv(*wp);
+ for (i = j = oldsize; i < newsize; i++) {
++#ifndef DEBIAN
+ if (search_access(words[i], X_OK, (int *) 0) >= 0) {
++#else /* DEBIAN */ /* patch from OpenBSD */
++ staterr = 0;
++ if ((search_access(words[i], X_OK, &staterr) >= 0)
++ || (staterr == EISDIR)) {
++#endif
+ words[j] = words[i];
+ if (!(flags & XCF_FULLPATH))
+ memmove(words[j], words[j] + pathlen,
+@@ -1018,4 +1075,42 @@
Xfree(xs, xp);
}
@@ -131,7 +576,7 @@
+ int rval=0;
+
+ for (add = 0, wlen = len; wlen - add > 0; add++) {
-+ if (strchr("\\$(){}*&;|<>\"'", s[add]) || strchr(ifs, s[add])) {
++ if (strchr("\\$(){}*&;#|<>\"'`", s[add]) || strchr(ifs, s[add])) {
+ if (putbuf_func(s, add) != 0) {
+ rval = -1;
+ break;
@@ -153,9 +598,8 @@
+}
+#endif /* DEBIAN */
#endif /* EDIT */
-diff -urN pdksh-5.2.14.org/edit.h pdksh-5.2.14/edit.h
---- pdksh-5.2.14.org/edit.h Mon Feb 26 12:16:47 2001
-+++ pdksh-5.2.14/edit.h Mon Feb 26 12:17:11 2001
+--- pdksh-5.2.14.orig/edit.h
++++ pdksh-5.2.14/edit.h
@@ -55,6 +55,9 @@
int x_longest_prefix ARGS((int nwords, char *const *words));
int x_basename ARGS((const char *s, const char *se));
@@ -166,9 +610,8 @@
/* emacs.c */
int x_emacs ARGS((char *buf, size_t len));
void x_init_emacs ARGS((void));
-diff -urN pdksh-5.2.14.org/emacs.c pdksh-5.2.14/emacs.c
---- pdksh-5.2.14.org/emacs.c Mon Feb 26 12:16:47 2001
-+++ pdksh-5.2.14/emacs.c Mon Feb 26 12:17:11 2001
+--- pdksh-5.2.14.orig/emacs.c
++++ pdksh-5.2.14/emacs.c
@@ -138,6 +138,10 @@
static int x_e_getc ARGS((void));
static void x_e_putc ARGS((int c));
@@ -185,7 +628,7 @@
#endif
{ XFUNC_complete, 1, CTRL('[') },
+#ifdef DEBIAN /* patch from OpenBSD */
-+ { XFUNC_complete, 0, CTRL('I') },
++ { XFUNC_comp_list, 0, CTRL('I') },
+#endif /* DEBIAN */
{ XFUNC_comp_list, 1, '=' },
{ XFUNC_enumerate, 1, '?' },
@@ -224,6 +667,18 @@
static int
x_del_back(c)
int c;
+@@ -856,9 +883,9 @@
+ }
+ x_histp = hp;
+ oldsize = x_size_str(xbuf);
+- (void)strcpy(xbuf, *hp);
++ (void)strncpy(xbuf, *hp, xend - xbuf - 1);
+ xbp = xbuf;
+- xep = xcp = xbuf + strlen(*hp);
++ xep = xcp = xbuf + strlen(xbuf);
+ xlp_valid = FALSE;
+ if (xep > x_lastcp())
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/SOURCES/pdksh-debian.patch?r1=1.3&r2=1.4&f=u
More information about the pld-cvs-commit
mailing list