Hi!

We've found that ksh removes some variables from environment (for example
variables containing space or hyphen). If you use tcsh, set these variables, run ksh and again tcsh, these wariables will be gone. (tcsh and again tcsh works fine.)

(bugzilla: #464156)

Excerpt from POSIX
(http://www.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap08.html):

Environment variable names used by the utilities in the Shell and Utilities
volume of IEEE Std 1003.1-2001 consist solely of uppercase letters, digits, and the '_' (underscore) from the characters defined in Portable Character Set and
do not begin with a digit. Other characters may be permitted by an
implementation; applications shall tolerate the presence of such names.
Uppercase and lowercase letters shall retain their unique identities and shall not be folded together. The name space of environment variable names containing
lowercase letters is reserved for applications. Applications can define any
environment variables with names from this name space without modifying the
behavior of the standard utilities.

"...applications shall tolerate the presence of such names..."

Therefore ksh should not alter the environment even though it does not
allow to access/set such variables.

I've made patch (attached) to fix this: Variables refused during ksh's initialization are kept in separated list and they are added to the environment for executed
applications.

It's quite simple with only a few new lines added.

What's your opinion about this?

Bye,

Michal
diff -up ./src/cmd/ksh93/include/nval.h.keepenv ./src/cmd/ksh93/include/nval.h
--- ./src/cmd/ksh93/include/nval.h.keepenv	2008-07-23 21:40:05.000000000 +0200
+++ ./src/cmd/ksh93/include/nval.h	2008-10-04 21:05:36.000000000 +0200
@@ -105,6 +105,14 @@ struct Namdecl
 	void		*optinfof;
 };
 
+/* list of strings refused from the environment initialization */
+struct Linelist_s {
+	char *line;
+	struct Linelist_s *next;
+};
+
+extern struct Linelist_s refused_envs;
+
 /* attributes of name-value node attribute flags */
 
 #define NV_DEFAULT 0
diff -up ./src/cmd/ksh93/sh/fault.c.keepenv ./src/cmd/ksh93/sh/fault.c
--- ./src/cmd/ksh93/sh/fault.c.keepenv	2008-06-25 18:25:00.000000000 +0200
+++ ./src/cmd/ksh93/sh/fault.c	2008-10-07 17:01:20.717001479 +0200
@@ -551,6 +551,7 @@ void sh_done(void *ptr, register int sig
 	Shell_t	*shp = (Shell_t*)ptr;
 	register char *t;
 	register int savxit = shp->exitval;
+	register struct Linelist_s *refenv = refused_envs.next, *freeval;
 	shp->trapnote = 0;
 	indone=1;
 	if(sig==0)
@@ -584,6 +585,17 @@ void sh_done(void *ptr, register int sig
 		job_walk(sfstderr,job_terminate,SIGHUP,NIL(char**));
 #endif	/* JOBS */
 	job_close(shp);
+
+	/* free up refused environment strings */
+	while(refenv)
+	{
+		freeval = refenv;
+		if (freeval->line) free(freeval->line);
+		free(freeval);
+		refenv = refenv->next;
+	}
+	refused_envs.next = NULL;
+
 	if(nv_search("VMTRACE", shp->var_tree,0))
 		strmatch((char*)0,(char*)0);
 	sfsync((Sfio_t*)sfstdin);
diff -up ./src/cmd/ksh93/sh/init.c.keepenv ./src/cmd/ksh93/sh/init.c
--- ./src/cmd/ksh93/sh/init.c.keepenv	2008-07-17 16:47:43.000000000 +0200
+++ ./src/cmd/ksh93/sh/init.c	2008-10-04 21:15:17.000000000 +0200
@@ -1553,6 +1553,7 @@ static void env_init(Shell_t *shp)
 	shp->env = env_open(environ,3);
 	env_delete(shp->env,"_");
 #endif
+	struct Linelist_s *refenv = &refused_envs;
 	if(ep)
 	{
 		while(cp= *ep++)
@@ -1565,6 +1566,16 @@ static void env_init(Shell_t *shp)
 				np->nvenv = cp;
 				nv_close(np);
 			}
+			else
+			{
+				/* refused string */
+				refenv->next = (struct Linelist_s *) malloc(sizeof(struct Linelist_s *));
+				refenv = refenv->next;
+				/* TODO: if envirnon is always accessible and its data */
+				/* are not changed at all, use pointers only */
+				refenv->line = strdup(cp);
+				refenv->next = NULL;
+			}
 		}
 		while(cp=next)
 		{
diff -up ./src/cmd/ksh93/sh/name.c.keepenv ./src/cmd/ksh93/sh/name.c
--- ./src/cmd/ksh93/sh/name.c.keepenv	2008-07-24 07:05:00.000000000 +0200
+++ ./src/cmd/ksh93/sh/name.c	2008-10-04 21:24:05.000000000 +0200
@@ -71,6 +71,8 @@ struct adata
 	char		*attval;
 };
 
+struct Linelist_s	refused_envs = { NULL, NULL };
+
 #if SHOPT_TYPEDEF
     struct sh_type
     {
@@ -1849,6 +1851,7 @@ char **sh_envgen(void)
 	register char **er;
 	register int namec;
 	register char *cp;
+	register struct Linelist_s *refenv = refused_envs.next;
 	struct adata data;
 	data.sh = &sh;
 	data.tp = 0;
@@ -1856,8 +1859,20 @@ char **sh_envgen(void)
 	nv_offattr(L_ARGNOD,NV_EXPORT);
 	data.attsize = 6;
 	namec = nv_scan(sh.var_tree,nullscan,(void*)0,NV_EXPORT,NV_EXPORT);
+	while(refenv)
+	{
+		namec++;
+		refenv = refenv->next;
+	}
 	er = (char**)stakalloc((namec+4)*sizeof(char*));
 	data.argnam = (er+=2);
+	refenv = refused_envs.next;
+	while(refenv)
+	{
+		*(data.argnam) = stakcopy(refenv->line);
+		data.argnam++;
+		refenv = refenv->next;
+	}
 	nv_scan(sh.var_tree, pushnam,&data,NV_EXPORT, NV_EXPORT);
 	*data.argnam = (char*)stakalloc(data.attsize);
 	cp = data.attval = strcopy(*data.argnam,e_envmarker);
_______________________________________________
ast-developers mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-developers

Reply via email to