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