mhlavink pushed to ksh (f22). "add missing patches"

notifications at fedoraproject.org notifications at fedoraproject.org
Mon Mar 30 14:52:48 UTC 2015


>From 194f7ef4b7fd5ce807275b50c8aebf76cb5300db Mon Sep 17 00:00:00 2001
From: Michal Hlavinka <mhlavink at redhat.com>
Date: Mon, 30 Mar 2015 16:52:20 +0200
Subject: add missing patches


diff --git a/ksh-20120801-alarmifs.patch b/ksh-20120801-alarmifs.patch
new file mode 100644
index 0000000..88b0ba9
--- /dev/null
+++ b/ksh-20120801-alarmifs.patch
@@ -0,0 +1,33 @@
+--- ksh-20120801/src/cmd/ksh93/sh/init.c	2014-12-10 20:11:17.693446084 -0200
++++ ksh-20120801/src/cmd/ksh93/sh/init.c	2014-12-10 20:11:24.753442619 -0200
+@@ -576,6 +576,7 @@ static char* get_ifs(register Namval_t*
+ 			shp->ifstable[' '] = shp->ifstable['\t'] = S_SPACE;
+ 			shp->ifstable['\n'] = S_NL;
+ 		}
++		shp->ifstable[0] = S_EOF;
+ 	}
+ 	return(value);
+ }
+--- ksh-20120801/src/cmd/ksh93/bltins/alarm.c	2014-12-18 12:03:39.198461933 -0200
++++ ksh-20120801/src/cmd/ksh93/bltins/alarm.c	2014-12-18 12:04:32.464421268 -0200
+@@ -130,6 +130,7 @@ void	sh_timetraps(Shell_t *shp)
+ {
+ 	register struct tevent *tp, *tpnext;
+ 	register struct tevent *tptop;
++	char	ifstable[256];
+ 	while(1)
+ 	{
+ 		shp->sigflag[SIGALRM] &= ~SH_SIGALRM;
+@@ -141,7 +142,11 @@ void	sh_timetraps(Shell_t *shp)
+ 			{
+ 				tp->flags &= ~L_FLAG;
+ 				if(tp->action)
++				{
++				    	memcpy(ifstable,shp->ifstable,sizeof(ifstable));
+ 					sh_fun(tp->action,tp->node,(char**)0);
++					memcpy(shp->ifstable,ifstable,sizeof(ifstable));
++				}
+ 				tp->flags &= ~L_FLAG;
+ 				if(!tp->flags)
+ 				{
+
diff --git a/ksh-20120801-assoc-unset-leak.patch b/ksh-20120801-assoc-unset-leak.patch
new file mode 100644
index 0000000..1af7d16
--- /dev/null
+++ b/ksh-20120801-assoc-unset-leak.patch
@@ -0,0 +1,20 @@
+diff -up ksh-20120801/src/cmd/ksh93/sh/name.c.orig ksh-20120801/src/cmd/ksh93/sh/name.c
+--- ksh-20120801/src/cmd/ksh93/sh/name.c.orig	2015-02-10 17:15:37.180783550 -0200
++++ ksh-20120801/src/cmd/ksh93/sh/name.c	2015-02-10 18:25:51.726228437 -0200
+@@ -1298,7 +1298,16 @@ void nv_delete(Namval_t* np, Dt_t *root,
+ 		if(dtdelete(root,np))
+ 		{
+ 			if(!(flags&NV_NOFREE) && ((flags&NV_FUNCTION) || !nv_subsaved(np,flags&NV_TABLE)))
++			{
++				Namarr_t	*ap;
++				if(nv_isarray(np) && np->nvfun && (ap=nv_arrayptr(np)) && array_assoc(ap)) {
++					while(nv_associative(np,0,NV_ANEXT))
++						nv_associative(np, 0, NV_ADELETE);
++					nv_associative(np, 0, NV_AFREE);
++					free((void*)np->nvfun);
++				}
+ 				free((void*)np);
++			}
+ 		}
+ #if 0
+ 		else
diff --git a/ksh-20120801-cdfork.patch b/ksh-20120801-cdfork.patch
new file mode 100644
index 0000000..c82cb4c
--- /dev/null
+++ b/ksh-20120801-cdfork.patch
@@ -0,0 +1,40 @@
+--- ksh-20120801/src/cmd/ksh93/sh/path.c	2014-09-01 15:08:06.738969962 -0300
++++ ksh-20120801/src/cmd/ksh93/sh/path.c	2014-09-01 15:13:51.321459978 -0300
+@@ -229,13 +229,12 @@ static pid_t path_xargs(Shell_t *shp,con
+ /*
+  * make sure PWD is set up correctly
+  * Return the present working directory
+- * Invokes getcwd() if flag==0 and if necessary
++ * Invokes getcwd() if necessary
+  * Sets the PWD variable to this value
+  */
+ char *path_pwd(Shell_t *shp,int flag)
+ {
+ 	register char *cp;
+-	register char *dfault = (char*)e_dot;
+ 	register int count = 0;
+ 	if(shp->pwd)
+ 		return((char*)shp->pwd);
+@@ -254,11 +253,6 @@ char *path_pwd(Shell_t *shp,int flag)
+ 				cp = "/";
+ 				break;
+ 			case 3:
+-				cp = (char*)e_crondir;
+-				if(flag) /* skip next case when non-zero flag */
+-					++count;
+-				break;
+-			case 4:
+ 			{
+ 				if(cp=getcwd(NIL(char*),0))
+ 				{  
+@@ -269,8 +263,8 @@ char *path_pwd(Shell_t *shp,int flag)
+ 				}
+ 				break;
+ 			}
+-			case 5:
++			case 4:
+-				return(dfault);
++				return((char*)e_dot);
+ 		}
+ 		if(cp && *cp=='/' && test_inode(cp,e_dot))
+ 			break;
diff --git a/ksh-20120801-emptyarrayinit.patch b/ksh-20120801-emptyarrayinit.patch
new file mode 100644
index 0000000..c888b31
--- /dev/null
+++ b/ksh-20120801-emptyarrayinit.patch
@@ -0,0 +1,11 @@
+--- ksh-20120801/src/cmd/ksh93/sh/array.c	2014-12-11 16:39:34.253860675 -0200
++++ ksh-20120801/src/cmd/ksh93/sh/array.c	2014-12-11 16:39:40.794857083 -0200
+@@ -1003,7 +1003,7 @@ Namarr_t *nv_setarray(Namval_t *np, void
+ 		ap->nelem = nelem;
+ 		ap->fun = fun;
+ 		nv_onattr(np,NV_ARRAY);
+-		if(fp || value)
++		if(fp || (value && value != Empty))
+ 		{
+ 			nv_putsub(np, "0", ARRAY_ADD);
+ 			if(value)
diff --git a/ksh-20120801-noexeccdfix.patch b/ksh-20120801-noexeccdfix.patch
new file mode 100644
index 0000000..47128e0
--- /dev/null
+++ b/ksh-20120801-noexeccdfix.patch
@@ -0,0 +1,40 @@
+From b8260293a8ed7849a358291faae7b58f4a05dcc9 Mon Sep 17 00:00:00 2001
+From: Kamil Dudka <kdudka at redhat.com>
+Date: Mon, 10 Nov 2014 18:23:34 +0100
+Subject: [PATCH] Resolves: #1160923 - handle failure of fchdir()
+
+... and chdir()
+---
+ src/cmd/ksh93/bltins/cd_pwd.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/src/cmd/ksh93/bltins/cd_pwd.c b/src/cmd/ksh93/bltins/cd_pwd.c
+index a972da6..c20959c 100644
+--- a/src/cmd/ksh93/bltins/cd_pwd.c
++++ b/src/cmd/ksh93/bltins/cd_pwd.c
+@@ -329,18 +329,20 @@ int	b_cd(int argc, char *argv[],Shbltin_t *context)
+ 		if(newdirfd >=0)
+ 		{
+ 			/* chdir for directories on HSM/tapeworms may take minutes */
+-			if(fchdir(newdirfd) >= 0)
++			if((rval=fchdir(newdirfd)) >= 0)
+ 			{
+ 				if(shp->pwdfd >= 0)
+ 					sh_close(shp->pwdfd);
+ 				shp->pwdfd=newdirfd;
+ 				goto success;
+ 			}
++			else
++				sh_close(newdirfd);
+ 		}
+ #ifndef O_SEARCH
+ 		else
+ 		{
+-			if(chdir(dir) >=0)
++			if((rval=chdir(dir)) >=0)
+ 			{
+ 				if(shp->pwdfd >= 0)
+ 				{
+-- 
+2.1.0
+
diff --git a/ksh-20120801-oldenvinit.patch b/ksh-20120801-oldenvinit.patch
new file mode 100644
index 0000000..8ee0863
--- /dev/null
+++ b/ksh-20120801-oldenvinit.patch
@@ -0,0 +1,95 @@
+diff -up ksh-20120801/src/cmd/ksh93/sh/init.c.fixset ksh-20120801/src/cmd/ksh93/sh/init.c
+--- ksh-20120801/src/cmd/ksh93/sh/init.c.fixset	2014-11-03 15:45:36.510997271 +0100
++++ ksh-20120801/src/cmd/ksh93/sh/init.c	2014-11-03 16:20:44.398917280 +0100
+@@ -2003,8 +2003,91 @@ static Dt_t *inittree(Shell_t *shp,const
+  * skip over items that are not name-value pairs
+  */
+ 
++
+ static void env_init(Shell_t *shp)
+ {
++	register char *cp;
++	register Namval_t	*np;
++	register char **ep=environ;
++	register char *next=0;
++#ifdef _ENV_H
++	shp->env = env_open(environ,3);
++	env_delete(shp->env,"_");
++#endif
++	if(ep)
++	{
++		while(cp= *ep++)
++		{
++			if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]=='=')
++				next = cp+4;
++			else if(np=nv_open(cp,shp->var_tree,(NV_EXPORT|NV_IDENT|NV_ASSIGN|NV_NOFAIL))) 
++			{
++				nv_onattr(np,NV_IMPORT);
++				np->nvenv = cp;
++				nv_close(np);
++			}
++			else  /* swap with front */
++			{
++				ep[-1] = environ[shp->nenv];
++				environ[shp->nenv++] = cp;
++			}
++		}
++		while(cp=next)
++		{
++			if(next = strchr(++cp,'='))
++				*next = 0;
++			np = nv_search(cp+2,shp->var_tree,NV_ADD);
++			if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))
++			{
++				int flag = *(unsigned char*)cp-' ';
++				int size = *(unsigned char*)(cp+1)-' ';
++				if((flag&NV_INTEGER) && size==0)
++				{
++					/* check for floating*/
++					char *ep,*val = nv_getval(np);
++					strtol(val,&ep,10);
++					if(*ep=='.' || *ep=='e' || *ep=='E')
++					{
++						char *lp;
++						flag |= NV_DOUBLE;
++						if(*ep=='.')
++						{
++							strtol(ep+1,&lp,10);
++							if(*lp)
++								ep = lp;
++						}
++						if(*ep && *ep!='.')
++						{
++							flag |= NV_EXPNOTE;
++							size = ep-val;
++						}
++						else
++							size = strlen(ep);
++						size--;
++					}
++				}
++				nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);
++			}
++			else
++				cp += 2;
++		}
++	}
++#ifdef _ENV_H
++	env_delete(shp->env,e_envmarker);
++#endif
++	if(nv_isnull(PWDNOD) || nv_isattr(PWDNOD,NV_TAGGED))
++	{
++		nv_offattr(PWDNOD,NV_TAGGED);
++		path_pwd(shp,0);
++	}
++	if((cp = nv_getval(SHELLNOD)) && (sh_type(cp)&SH_TYPE_RESTRICTED))
++		sh_onoption(SH_RESTRICTED); /* restricted shell */
++	return;
++}
++
++
++static void env_init_backup(Shell_t *shp)
++{
+ 	register char		*cp;
+ 	register Namval_t	*np,*mp;
+ 	register char		**ep=environ;
diff --git a/ksh-20120801-retfix.patch b/ksh-20120801-retfix.patch
new file mode 100644
index 0000000..bcb5b33
--- /dev/null
+++ b/ksh-20120801-retfix.patch
@@ -0,0 +1,20 @@
+diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.retfix ksh-20120801/src/cmd/ksh93/sh/subshell.c
+--- ksh-20120801/src/cmd/ksh93/sh/subshell.c.retfix	2014-09-01 13:50:02.956085721 +0200
++++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2014-09-01 13:54:01.104818416 +0200
+@@ -652,6 +652,16 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_
+ 		}
+ 		else
+ 		{
++			if(comsub!=1 && shp->spid)
++			{
++				int c = shp->exitval;
++				job_wait(shp->spid);
++				shp->exitval = c;
++				exitset();
++				if(shp->pipepid==shp->spid)
++					shp->spid = 0;
++				shp->pipepid = 0;
++			}
+ 			job.hack1_waitall=0;
+ 			/* move tmp file to iop and restore sfstdout */
+ 			iop = sfswap(sfstdout,NIL(Sfio_t*));
diff --git a/ksh-20120801-trapcom.patch b/ksh-20120801-trapcom.patch
new file mode 100644
index 0000000..a900b54
--- /dev/null
+++ b/ksh-20120801-trapcom.patch
@@ -0,0 +1,47 @@
+diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.orig ksh-20120801/src/cmd/ksh93/sh/subshell.c
+--- ksh-20120801/src/cmd/ksh93/sh/subshell.c.orig	2014-08-23 20:20:24.676186573 -0300
++++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2014-08-23 20:29:00.772151283 -0300
+@@ -481,12 +481,12 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_
+ {
+ 	struct subshell sub_data;
+ 	register struct subshell *sp = &sub_data;
+-	int jmpval,nsig=0,duped=0;
++	int jmpval,isig,nsig=0,duped=0;
+ 	long savecurenv = shp->curenv;
+ 	int savejobpgid = job.curpgid;
+ 	int *saveexitval = job.exitval;
+ 	int16_t subshell;
+-	char *savsig;
++	char **savsig;
+ 	Sfio_t *iop=0;
+ 	struct checkpt buff;
+ 	struct sh_scoped savst;
+@@ -561,10 +561,13 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_
+ 		/* save trap table */
+ 		shp->st.otrapcom = 0;
+ 		shp->st.otrap = savst.trap;
+-		if((nsig=shp->st.trapmax*sizeof(char*))>0 || shp->st.trapcom[0])
++		if((nsig=shp->st.trapmax)>0 || shp->st.trapcom[0])
+ 		{
+-			nsig += sizeof(char*);
+-			memcpy(savsig=malloc(nsig),(char*)&shp->st.trapcom[0],nsig);
++			++nsig;
++			savsig = malloc(nsig * sizeof(char*));
++			/* contents of shp->st.st.trapcom may change */
++			for (isig = 0; isig < nsig; ++isig)
++				savsig[isig] = shp->st.trapcom[isig] ? strdup(shp->st.trapcom[isig]) : NULL;
+ 			/* this nonsense needed for $(trap) */
+ 			shp->st.otrapcom = (char**)savsig;
+ 		}
+@@ -729,7 +732,10 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_
+ 		shp->st.otrap = 0;
+ 		if(nsig)
+ 		{
+-			memcpy((char*)&shp->st.trapcom[0],savsig,nsig);
++			for (isig = 0; isig < nsig; ++isig)
++				if (shp->st.trapcom[isig])
++					free(shp->st.trapcom[isig]);
++			memcpy((char*)&shp->st.trapcom[0],savsig,nsig*sizeof(char*));
+ 			free((void*)savsig);
+ 		}
+ 		shp->options = sp->options;
diff --git a/ksh-20140929-safefd.patch b/ksh-20140929-safefd.patch
new file mode 100644
index 0000000..80db205
--- /dev/null
+++ b/ksh-20140929-safefd.patch
@@ -0,0 +1,52 @@
+diff -up ksh-20120801/src/cmd/ksh93/include/io.h.safefd ksh-20120801/src/cmd/ksh93/include/io.h
+--- ksh-20120801/src/cmd/ksh93/include/io.h.safefd	2015-03-03 18:21:40.544732158 +0100
++++ ksh-20120801/src/cmd/ksh93/include/io.h	2015-03-03 18:22:16.284447849 +0100
+@@ -78,6 +78,7 @@ extern void 	sh_iorestore(Shell_t*,int,i
+ extern Sfio_t 	*sh_iostream(Shell_t*,int);
+ extern int	sh_redirect(Shell_t*,struct ionod*,int);
+ extern void 	sh_iosave(Shell_t *, int,int,char*);
++extern int 	safefdnumber(Shell_t* shp, int sfd);
+ extern int 	sh_iovalidfd(Shell_t*, int);
+ extern int 	sh_inuse(Shell_t*, int);
+ extern void 	sh_iounsave(Shell_t*);
+diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.safefd ksh-20120801/src/cmd/ksh93/sh/io.c
+--- ksh-20120801/src/cmd/ksh93/sh/io.c.safefd	2015-03-03 18:21:40.511732421 +0100
++++ ksh-20120801/src/cmd/ksh93/sh/io.c	2015-03-03 18:21:40.544732158 +0100
+@@ -1724,6 +1724,25 @@ void sh_iosave(Shell_t *shp, register in
+ 	}
+ }
+ 
++int safefdnumber(Shell_t* shp, int sfd)
++{
++	register int fd;
++
++	while(1)
++	{
++		for(fd=0; fd < shp->topfd; fd++)
++		{
++			if (filemap[fd].save_fd==sfd || filemap[fd].orig_fd==sfd || (fcntl(sfd, F_GETFD) != -1 || errno != EBADF))
++			{
++				sfd++;
++				continue;
++			}
++		}
++		break;
++	}
++	return sfd;
++}
++
+ /*
+  *  close all saved file descriptors
+  */
+diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd ksh-20120801/src/cmd/ksh93/sh/subshell.c
+--- ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd	2015-03-03 18:21:40.531732261 +0100
++++ ksh-20120801/src/cmd/ksh93/sh/subshell.c	2015-03-03 18:21:40.544732158 +0100
+@@ -673,7 +673,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_
+ 			}
+ 			if(iop && sffileno(iop)==1)
+ 			{
+-				int fd=sfsetfd(iop,3);
++				int fd=sfsetfd(iop,safefdnumber(shp,3));
+ 				if(fd<0)
+ 				{
+ 					shp->toomany = 1;
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/ksh.git/commit/?h=f22&id=194f7ef4b7fd5ce807275b50c8aebf76cb5300db


More information about the scm-commits mailing list