From ac71aa183f8278bd305d88da89a79356f727703d283b63aa1ceb3d65c827f885 Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Thu, 7 Nov 2013 12:12:10 +0000 Subject: [PATCH 1/2] . OBS-URL: https://build.opensuse.org/package/show/shells/ksh?expand=0&rev=186 --- ksh93-dttree-crash.dif | 448 ++++++++++++++++++++++++++++++++++++++--- ksh93-fdstatus.dif | 33 +-- 2 files changed, 438 insertions(+), 43 deletions(-) diff --git a/ksh93-dttree-crash.dif b/ksh93-dttree-crash.dif index df45b23..68fb9ba 100644 --- a/ksh93-dttree-crash.dif +++ b/ksh93-dttree-crash.dif @@ -1,6 +1,388 @@ +--- src/cmd/ksh93/bltins/typeset.c ++++ src/cmd/ksh93/bltins/typeset.c 2013-10-25 13:20:42.799733785 +0000 +@@ -579,7 +579,7 @@ static int setall(char **argv,regist + np = sh_fsearch(shp,name,NV_ADD|HASH_NOSCOPE); + else + #endif /* SHOPT_NAMESPACE */ +- np = nv_open(name,sh_subfuntree(1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE); ++ np = nv_open(name,sh_subfuntree(shp,1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE); + } + else + { +@@ -1168,14 +1168,14 @@ static int unall(int argc, char **argv, + { + name = sh_optunalias; + if(shp->subshell) +- troot = sh_subaliastree(0); ++ troot = sh_subaliastree(shp,0); + } + else + name = sh_optunset; + while(r = optget(argv,name)) switch(r) + { + case 'f': +- troot = sh_subfuntree(1); ++ troot = sh_subfuntree(shp,1); + break; + case 'a': + all=1; +--- src/cmd/ksh93/include/defs.h ++++ src/cmd/ksh93/include/defs.h 2013-10-25 13:20:42.799733785 +0000 +@@ -423,10 +423,10 @@ extern void sh_printopts(Shopt_t,int,Sh + extern int sh_readline(Shell_t*,char**,volatile int,int,ssize_t,long); + extern Sfio_t *sh_sfeval(char*[]); + extern void sh_setmatch(Shell_t*,const char*,int,int,int[],int); +-extern Dt_t *sh_subaliastree(int); ++extern Dt_t *sh_subaliastree(Shell_t*,int); + extern void sh_scope(Shell_t*, struct argnod*, int); + extern Namval_t *sh_scoped(Shell_t*, Namval_t*); +-extern Dt_t *sh_subfuntree(int); ++extern Dt_t *sh_subfuntree(Shell_t*,int); + extern void sh_subjobcheck(pid_t); + extern int sh_subsavefd(int); + extern void sh_subtmpfile(Shell_t*); +--- src/cmd/ksh93/sh/arith.c ++++ src/cmd/ksh93/sh/arith.c 2013-10-25 13:20:42.799733785 +0000 +@@ -180,7 +180,10 @@ static Namval_t *scope(register Namval_t + { + ap = nv_arrayptr(np); + if(ap && !ap->table) ++ { + ap->table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->table,shp,1); ++ } + if(ap && ap->table && (nq=nv_search(nv_getsub(np),ap->table,NV_ADD))) + nq->nvenv = (char*)np; + if(nq && nv_isnull(nq)) +--- src/cmd/ksh93/sh/array.c ++++ src/cmd/ksh93/sh/array.c 2013-10-25 13:20:42.800733693 +0000 +@@ -79,6 +79,7 @@ struct assoc_array + + static Namarr_t *array_scope(Namval_t *np, Namarr_t *ap, int flags) + { ++ Shell_t *shp = sh_getinterp(); + Namarr_t *aq; + #if SHOPT_FIXEDARRAY + struct fixed_array *fp; +@@ -95,6 +96,7 @@ static Namarr_t *array_scope(Namval_t *n + if(is_associative(aq)) + { + aq->scope = (void*)dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(aq->scope,shp,1); + dtview((Dt_t*)aq->scope,aq->table); + aq->table = (Dt_t*)aq->scope; + return(aq); +@@ -271,6 +273,7 @@ int nv_arrayisset(Namval_t *np, Namarr_t + */ + static Namval_t *array_find(Namval_t *np,Namarr_t *arp, int flag) + { ++ Shell_t *shp=sh_getinterp(); + register struct index_array *ap = (struct index_array*)arp; + register union Value *up; + Namval_t *mp; +@@ -373,7 +376,10 @@ static Namval_t *array_find(Namval_t *np + { + char *cp; + if(!ap->header.table) ++ { + ap->header.table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->header.table,shp,1); ++ } + sfprintf(sh.strbuf,"%d",ap->cur); + cp = sfstruse(sh.strbuf); + mp = nv_search(cp, ap->header.table, NV_ADD); +@@ -402,6 +408,7 @@ static Namval_t *array_find(Namval_t *np + #if SHOPT_TYPEDEF + int nv_arraysettype(Namval_t *np, Namval_t *tp, const char *sub, int flags) + { ++ Shell_t *shp = sh_getinterp(); + Namval_t *nq; + char *av[2]; + int rdonly = nv_isattr(np,NV_RDONLY); +@@ -410,7 +417,10 @@ int nv_arraysettype(Namval_t *np, Namval + av[1] = 0; + sh.last_table = 0; + if(!ap->table) ++ { + ap->table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->table,shp,1); ++ } + if(nq = nv_search(sub, ap->table, NV_ADD)) + { + if(!nq->nvfun && nq->nvalue.cp && *nq->nvalue.cp==0) +@@ -485,6 +495,7 @@ static Namfun_t *array_clone(Namval_t *n + if(ap->table) + { + ap->table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->table,shp,1); + if(ap->scope && !(flags&NV_COMVAR)) + { + ap->scope = ap->table; +@@ -854,7 +865,9 @@ static struct index_array *array_grow(Na + np->nvalue.cp=0; + if(nv_hasdisc(np,&array_disc) || (nv_type(np) && nv_isvtree(np))) + { ++ Shell_t *shp = sh_getinterp(); + ap->header.table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->header.table,shp,1); + mp = nv_search("0", ap->header.table,NV_ADD); + if(mp && nv_isnull(mp)) + { +@@ -1169,6 +1182,7 @@ int nv_nextsub(Namval_t *np) + */ + Namval_t *nv_putsub(Namval_t *np,register char *sp,register long mode) + { ++ Shell_t *shp = sh_getinterp(); + register struct index_array *ap = (struct index_array*)nv_arrayptr(np); + register int size = (mode&ARRAY_MASK); + #if SHOPT_FIXEDARRAY +@@ -1180,7 +1194,6 @@ Namval_t *nv_putsub(Namval_t *np,registe + { + if(sp) + { +- Shell_t *shp = sh_getinterp(); + if(ap && ap->xp && !strmatch(sp,"+([0-9])")) + { + Namval_t *mp = nv_namptr(ap->xp,0); +@@ -1258,7 +1271,10 @@ Namval_t *nv_putsub(Namval_t *np,registe + char *cp; + Namval_t *mp; + if(!ap->header.table) ++ { + ap->header.table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->header.table,shp,1); ++ } + sfprintf(sh.strbuf,"%d",ap->cur); + cp = sfstruse(sh.strbuf); + mp = nv_search(cp, ap->header.table, NV_ADD); +@@ -1666,6 +1682,7 @@ int nv_aimax(register Namval_t* np) + */ + void *nv_associative(register Namval_t *np,const char *sp,int mode) + { ++ Shell_t *shp = sh_getinterp(); + register struct assoc_array *ap = (struct assoc_array*)nv_arrayptr(np); + register int type; + switch(mode) +@@ -1674,6 +1691,7 @@ void *nv_associative(register Namval_t * + if(ap = (struct assoc_array*)calloc(1,sizeof(struct assoc_array))) + { + ap->header.table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->header.table,shp,1); + ap->cur = 0; + ap->pos = 0; + ap->header.hdr.disc = &array_disc; +@@ -1742,7 +1760,6 @@ void *nv_associative(register Namval_t * + case NV_ANAME: + if(ap->cur) + { +- Shell_t *shp = sh_getinterp(); + if(!shp->instance && nv_isnull(ap->cur)) + return(NIL(void*)); + return((void*)ap->cur->nvname); +--- src/cmd/ksh93/sh/init.c ++++ src/cmd/ksh93/sh/init.c 2013-10-25 13:20:42.800733693 +0000 +@@ -1909,9 +1909,13 @@ static Init_t *nv_init(Shell_t *shp) + (OPTINDNOD)->nvalue.lp = (&shp->st.optindex); + /* set up the seconds clock */ + shp->alias_tree = inittree(shp,shtab_aliases); ++ dtuserdata(shp->alias_tree,shp,1); + shp->track_tree = dtopen(&_Nvdisc,Dtset); ++ dtuserdata(shp->track_tree,shp,1); + shp->bltin_tree = inittree(shp,(const struct shtable2*)shtab_builtins); ++ dtuserdata(shp->bltin_tree,shp,1); + shp->fun_tree = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(shp->fun_tree,shp,1); + dtview(shp->fun_tree,shp->bltin_tree); + nv_mount(DOTSHNOD, "type", shp->typedict=dtopen(&_Nvdisc,Dtoset)); + nv_adddisc(DOTSHNOD, shdiscnames, (Namval_t**)0); +@@ -1954,6 +1958,7 @@ static Dt_t *inittree(Shell_t *shp,const + nbltins = n; + } + base_treep = treep = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(treep,shp,1); + treep->user = (void*)shp; + for(tp=name_vals;*tp->sh_name;tp++,np++) + { +--- src/cmd/ksh93/sh/macro.c ++++ src/cmd/ksh93/sh/macro.c 2013-10-25 13:20:42.801733601 +0000 +@@ -2742,7 +2742,10 @@ static char *sh_tilde(Shell_t *shp,regis + skip: + #endif /* _WINIX */ + if(!logins_tree) ++ { + logins_tree = dtopen(&_Nvdisc,Dtbag); ++ dtuserdata(logins_tree,shp,1); ++ } + if(np=nv_search(string,logins_tree,NV_ADD)) + { + c = shp->subshell; +--- src/cmd/ksh93/sh/name.c ++++ src/cmd/ksh93/sh/name.c 2013-10-25 13:20:42.802733508 +0000 +@@ -821,6 +821,7 @@ Namval_t *nv_create(const char *name, D + { + Dt_t *dp = dtview(shp->var_tree,(Dt_t*)0); + rp->sdict = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(rp->sdict,shp,1); + dtview(rp->sdict,dp); + dtview(shp->var_tree,rp->sdict); + } +@@ -1170,7 +1171,10 @@ Namval_t *nv_create(const char *name, D + ap = nv_arrayptr(np); + } + if(n && ap && !ap->table) ++ { + ap->table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->table,shp,1); ++ } + if(ap && ap->table && (nq=nv_search(sub,ap->table,n))) + nq->nvenv = (char*)np; + if(nq && nv_isnull(nq)) +@@ -1391,7 +1395,7 @@ Namval_t *nv_open(const char *name, Dt_t + while((c= *(unsigned char*)cp++) && (c!='=') && (c!='/') && + (c>=0x200 || !(c=sh_lexstates[ST_NORM][c]) || c==S_EPAT || c==S_COLON)); + if(shp->subshell && c=='=') +- root = sh_subaliastree(1); ++ root = sh_subaliastree(shp,1); + if(c= *--cp) + *cp = 0; + np = nv_search(name, root, (flags&NV_NOADD)?0:NV_ADD); +@@ -2350,6 +2354,7 @@ void sh_scope(Shell_t *shp, struct argno + newroot = nv_dict(shp->namespace); + #endif /* SHOPT_NAMESPACE */ + newscope = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(newscope,shp,1); + if(envlist) + { + dtview(newscope,(Dt_t*)shp->var_tree); +@@ -3334,7 +3339,10 @@ int nv_rename(register Namval_t *np, int + if(ap=nv_arrayptr(np)) + { + if(!ap->table) ++ { + ap->table = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(ap->table,shp,1); ++ } + if(ap->table) + mp = nv_search(nv_getsub(np),ap->table,NV_ADD); + nv_arraychild(np,mp,0); +--- src/cmd/ksh93/sh/nvdisc.c ++++ src/cmd/ksh93/sh/nvdisc.c 2013-10-25 13:20:42.802733508 +0000 +@@ -246,6 +246,7 @@ static void chktfree(register Namval_t * + */ + static void assign(Namval_t *np,const char* val,int flags,Namfun_t *handle) + { ++ Shell_t *shp = sh_getinterp(); + int type = (flags&NV_APPEND)?APPEND:ASSIGN; + register struct vardisc *vp = (struct vardisc*)handle; + register Namval_t *nq = vp->disc[type]; +@@ -330,7 +331,7 @@ static void assign(Namval_t *np,const ch + } + else if(!nq || !isblocked(bp,type)) + { +- Dt_t *root = sh_subfuntree(1); ++ Dt_t *root = sh_subfuntree(shp,1); + int n; + Namarr_t *ap; + block(bp,type); +@@ -1296,6 +1297,7 @@ static Namfun_t *clone_table(Namval_t* n + Dt_t *oroot=tp->dict,*nroot=dtopen(&_Nvdisc,Dtoset); + if(!nroot) + return(0); ++ dtuserdata(nroot,dtuserdata(oroot,0,0),1); + memcpy((void*)ntp,(void*)fp,sizeof(struct table)); + ntp->dict = nroot; + ntp->parent = nv_lastdict(); +@@ -1493,6 +1495,6 @@ Namval_t *sh_fsearch(Shell_t *shp, const + sfputr(stkp,nv_name(shp->namespace),'.'); + sfputr(stkp,fname,0); + fname = stkptr(stkp,offset); +- return(nv_search(fname,sh_subfuntree(add&NV_ADD),add)); ++ return(nv_search(fname,sh_subfuntree(shp,add&NV_ADD),add)); + } + #endif /* SHOPT_NAMESPACE */ +--- src/cmd/ksh93/sh/path.c ++++ src/cmd/ksh93/sh/path.c 2013-10-25 13:20:42.803733416 +0000 +@@ -592,7 +592,7 @@ static void funload(Shell_t *shp,int fno + pname = path_fullname(shp,stakptr(PATH_OFFSET)); + if(shp->fpathdict && (rp = dtmatch(shp->fpathdict,(void*)pname))) + { +- Dt_t *funtree = sh_subfuntree(1); ++ Dt_t *funtree = sh_subfuntree(shp,1); + while(1) + { + rpfirst = dtprev(shp->fpathdict,rp); +@@ -868,13 +868,13 @@ Pathcomp_t *path_absolute(Shell_t *shp,r + if(isfun && f>=0 && (cp = strrchr(name,'.'))) + { + *cp = 0; +- if(nv_open(name,sh_subfuntree(1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE)) ++ if(nv_open(name,sh_subfuntree(shp,1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE)) + f = -1; + *cp = '.'; + } + if(isfun && f>=0) + { +- nv_onattr(nv_open(name,sh_subfuntree(1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE),NV_LTOU|NV_FUNCTION); ++ nv_onattr(nv_open(name,sh_subfuntree(shp,1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE),NV_LTOU|NV_FUNCTION); + funload(shp,f,name); + close(f); + f = -1; +--- src/cmd/ksh93/sh/subshell.c ++++ src/cmd/ksh93/sh/subshell.c 2013-10-25 13:20:42.803733416 +0000 +@@ -379,7 +379,7 @@ static void nv_restore(struct subshell * + * return pointer to alias tree + * create new one if in a subshell and one doesn't exist and create is non-zero + */ +-Dt_t *sh_subaliastree(int create) ++Dt_t *sh_subaliastree(Shell_t *shp,int create) + { + register struct subshell *sp = subshell_data; + if(!sp || sp->shp->curenv==0) +@@ -387,6 +387,7 @@ Dt_t *sh_subaliastree(int create) + if(!sp->salias && create) + { + sp->salias = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(sp->salias,shp,1); + dtview(sp->salias,sp->shp->alias_tree); + sp->shp->alias_tree = sp->salias; + } +@@ -397,7 +398,7 @@ Dt_t *sh_subaliastree(int create) + * return pointer to function tree + * create new one if in a subshell and one doesn't exist and create is non-zero + */ +-Dt_t *sh_subfuntree(int create) ++Dt_t *sh_subfuntree(Shell_t *shp,int create) + { + register struct subshell *sp = subshell_data; + if(!sp || sp->shp->curenv==0) +@@ -405,6 +406,7 @@ Dt_t *sh_subfuntree(int create) + if(!sp->sfun && create) + { + sp->sfun = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(sp->sfun,shp,1); + dtview(sp->sfun,sp->shp->fun_tree); + sp->shp->fun_tree = sp->sfun; + } --- src/cmd/ksh93/sh/xec.c -+++ src/cmd/ksh93/sh/xec.c 2013-02-01 16:22:50.000000000 +0000 -@@ -2741,11 +2741,6 @@ int sh_exec(register const Shnode_t *t, ++++ src/cmd/ksh93/sh/xec.c 2013-10-25 13:20:42.804733324 +0000 +@@ -2688,6 +2688,7 @@ int sh_exec(register const Shnode_t *t, + else + { + root = dtopen(&_Nvdisc,Dtoset); ++ dtuserdata(root,shp,1); + nv_mount(np, (char*)0, root); + np->nvalue.cp = Empty; + dtview(root,shp->var_base); +@@ -2729,7 +2730,7 @@ int sh_exec(register const Shnode_t *t, + np = sh_fsearch(shp,fname,NV_ADD|HASH_NOSCOPE); + if(!np) + #endif /* SHOPT_NAMESPACE */ +- np = nv_open(fname,sh_subfuntree(1),NV_NOASSIGN|NV_NOARRAY|NV_VARNAME|NV_NOSCOPE); ++ np = nv_open(fname,sh_subfuntree(shp,1),NV_NOASSIGN|NV_NOARRAY|NV_VARNAME|NV_NOSCOPE); + if(npv) + { + if(!shp->mktype) +@@ -2743,11 +2744,6 @@ int sh_exec(register const Shnode_t *t, slp = (struct slnod*)np->nvenv; sh_funstaks(slp->slchild,-1); stakdelete(slp->slptr); @@ -12,7 +394,7 @@ if(rp->sdict) { Namval_t *mp, *nq; -@@ -2759,6 +2754,12 @@ int sh_exec(register const Shnode_t *t, +@@ -2761,6 +2757,12 @@ int sh_exec(register const Shnode_t *t, dtclose(rp->sdict); rp->sdict = 0; } @@ -25,29 +407,19 @@ } if(!np->nvalue.rp) { -@@ -2769,7 +2770,7 @@ int sh_exec(register const Shnode_t *t, - { - static Dtdisc_t _Rpdisc = - { -- offsetof(struct Ufunction,fname), -1, sizeof(struct Ufunction) -+ offsetof(struct Ufunction,fname), -1, sizeof(struct Ufunction) - }; - struct functnod *fp; - struct comnod *ac = t->funct.functargs; -@@ -2796,8 +2797,10 @@ int sh_exec(register const Shnode_t *t, - rp->np = np; +@@ -2799,7 +2801,10 @@ int sh_exec(register const Shnode_t *t, if(!shp->fpathdict) shp->fpathdict = dtopen(&_Rpdisc,Dtobag); -- if(shp->fpathdict) -+ if(shp->fpathdict) { -+ /* dtuserdata(shp->fpathdict,shp,1); */ + if(shp->fpathdict) ++ { ++ dtuserdata(shp->fpathdict,shp,1); dtinsert(shp->fpathdict,rp); + } } } else --- src/lib/libast/Mamfile -+++ src/lib/libast/Mamfile 2013-01-30 10:01:13.000000000 +0000 ++++ src/lib/libast/Mamfile 2013-10-25 13:20:42.806733139 +0000 @@ -3969,6 +3969,14 @@ meta dtopen.o %.c>%.o cdt/dtopen.c dtope prev cdt/dtopen.c exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icdt -Icomp -Iinclude -Istd -I${INSTALLROOT}/include/ast -D_PACKAGE_ast -c cdt/dtopen.c @@ -87,8 +459,30 @@ exec - ${AR} rc libast.a _sfputu.o clearerr.o fclose.o fdopen.o feof.o ferror.o fflush.o fgetc.o fgetpos.o fgets.o fileno.o fopen.o fprintf.o fpurge.o fputc.o fputs.o fread.o freopen.o fscanf.o fseek.o fseeko.o fsetpos.o ftell.o ftello.o fwrite.o flockfile.o ftrylockfile.o funlockfile.o getc.o getchar.o getw.o pclose.o popen.o printf.o putc.o putchar.o puts.o putw.o rewind.o scanf.o setbuf.o setbuffer.o setlinebuf.o setvbuf.o snprintf.o sprintf.o sscanf.o asprintf.o vasprintf.o tmpfile.o ungetc.o vfprintf.o vfscanf.o vprintf.o vscanf.o vsnprintf.o vsprintf.o vsscanf.o _doprnt.o _doscan.o _filbuf.o _flsbuf.o _stdfun.o _stdopen.o _stdprintf.o _stdscanf.o _stdsprnt.o _stdvbuf.o _stdvsnprnt.o _stdvsprnt.o _stdvsscn.o fgetwc.o fwprintf.o putwchar.o vfwscanf.o wprintf.o fgetws.o fwscanf.o swprintf.o vswprintf.o wscanf.o fputwc.o getwc.o swscanf.o vswscanf.o fputws.o getwchar.o ungetwc.o vwprintf.o fwide.o putwc.o vfwprintf.o vwscanf.o stdio_c99.o fcloseall.o fmemopen.o getdelim.o getline.o frexp.o frexpl.o astcopy.o exec - ${AR} rc libast.a astconf.o astdynamic.o astlicense.o astquery.o astwinsize.o conftab.o aststatic.o getopt.o getoptl.o aso.o asolock.o asometh.o asorelax.o aso-sem.o aso-fcntl.o vmbest.o vmclear.o vmclose.o vmdcheap.o vmdebug.o vmdisc.o vmexit.o vmlast.o vmopen.o vmpool.o vmprivate.o vmprofile.o vmregion.o vmsegment.o vmset.o vmstat.o vmstrdup.o vmtrace.o vmwalk.o vmmopen.o malloc.o vmgetmem.o a64l.o acosh.o asinh.o atanh.o cbrt.o crypt.o erf.o err.o exp.o exp__E.o expm1.o gamma.o getpass.o lgamma.o log.o log1p.o log__L.o rand48.o random.o rcmd.o rint.o support.o sfstrtmp.o spawn.o exec - (ranlib libast.a) >/dev/null 2>&1 || true +--- src/lib/libast/cdt/cdtlib.h ++++ src/lib/libast/cdt/cdtlib.h 2013-10-25 13:20:42.807733047 +0000 +@@ -58,9 +58,9 @@ + /* This struct holds private method data created on DT_OPEN */ + struct _dtdata_s + { unsigned int lock; /* general dictionary lock */ +- Dtuser_t user; /* application's data */ + unsigned int type; /* method type, control flags */ + ssize_t size; /* number of objects */ ++ Dtuser_t user; /* application's data */ + Dt_t dict; /* when DT_INDATA is requested */ + }; + +@@ -123,7 +123,7 @@ typedef struct _dtlib_s + #endif /* _BLD_cdt */ + + /* these macros lock/unlock dictionaries. DTRETURN substitutes for "return" */ +-#define DTSETLOCK(dt) (((dt)->data->type&DT_SHARE) ? asolock(&(dt)->data->lock,1,ASO_SPINLOCK) : 0 ) ++#define DTSETLOCK(dt) (((dt)->data->type&DT_SHARE) ? asolock(&(dt)->data->lock,1,ASO_LOCK) : 0 ) + #define DTCLRLOCK(dt) (((dt)->data->type&DT_SHARE) ? asolock(&(dt)->data->lock,1,ASO_UNLOCK) : 0 ) + #define DTRETURN(ob,rv) do { (ob) = (rv); goto dt_return; } while(0) + #define DTERROR(dt, mesg) (!((dt)->disc && (dt)->disc->eventf) ? 0 : \ --- src/lib/libast/cdt/dtcomp.c -+++ src/lib/libast/cdt/dtcomp.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dtcomp.c 2013-10-25 13:20:42.807733047 +0000 @@ -52,9 +52,3 @@ extern ssize_t dtsize(Dt_t* d) { return (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_STAT); @@ -100,7 +494,7 @@ - return (ssize_t)(*(_DT(d)->searchf))((d),(Void_t*)(0),DT_STAT); -} --- src/lib/libast/cdt/dthash.c -+++ src/lib/libast/cdt/dthash.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dthash.c 2013-10-25 13:20:42.807733047 +0000 @@ -52,11 +52,13 @@ static int htable(Dt_t* dt) if((n = hash->tblz) > 0 && (hash->type&H_FIXED) ) return 0; /* fixed size table */ @@ -190,7 +584,7 @@ do_insert: /* inserting a new object */ --- src/lib/libast/cdt/dtlist.c -+++ src/lib/libast/cdt/dtlist.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dtlist.c 2013-10-25 13:20:42.807733047 +0000 @@ -142,9 +142,9 @@ int type; } @@ -234,7 +628,7 @@ if(type&(DT_DELETE|DT_DETACH|DT_REMOVE)) --- src/lib/libast/cdt/dtopen.c -+++ src/lib/libast/cdt/dtopen.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dtopen.c 2013-10-25 13:20:42.808732955 +0000 @@ -153,25 +153,3 @@ void _dtfree(Dt_t* dt, Dtlink_t* l, int if(disc->link < 0) /* free holder */ (void)(*dt->memoryf)(dt, (Void_t*)l, 0, disc); @@ -262,7 +656,7 @@ - } -} --- src/lib/libast/cdt/dtstat.c -+++ src/lib/libast/cdt/dtstat.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dtstat.c 2013-10-25 13:20:42.808732955 +0000 @@ -0,0 +1,54 @@ +/*********************************************************************** +* * @@ -319,7 +713,7 @@ + return sz; +} --- src/lib/libast/cdt/dtstrhash.c -+++ src/lib/libast/cdt/dtstrhash.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dtstrhash.c 2013-10-25 13:20:42.808732955 +0000 @@ -22,40 +22,38 @@ #include "dthdr.h" @@ -380,7 +774,7 @@ + return h; } --- src/lib/libast/cdt/dttree.c -+++ src/lib/libast/cdt/dttree.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dttree.c 2013-10-25 13:20:42.808732955 +0000 @@ -545,7 +545,14 @@ int type; } else goto no_root; @@ -449,7 +843,7 @@ if(!(root = _dtmake(dt, obj, type)) ) { obj = NIL(Void_t*); --- src/lib/libast/cdt/dtuser.c -+++ src/lib/libast/cdt/dtuser.c 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/cdt/dtuser.c 2013-10-25 13:20:42.808732955 +0000 @@ -0,0 +1,59 @@ +/*********************************************************************** +* * @@ -511,7 +905,7 @@ + else return (*dt->disc->eventf)(dt, DT_ANNOUNCE|DT_USER|flags, data, dt->disc); +} --- src/lib/libast/include/cdt.h -+++ src/lib/libast/include/cdt.h 2012-12-20 10:29:45.000000000 +0000 ++++ src/lib/libast/include/cdt.h 2013-10-25 13:20:42.809732863 +0000 @@ -164,6 +164,7 @@ struct _dtstat_s ssize_t msize; /* max #defined elts in below arrays */ ssize_t lsize[DT_MAXSIZE]; /* #objects by level */ diff --git a/ksh93-fdstatus.dif b/ksh93-fdstatus.dif index 9f1cba3..e02f523 100644 --- a/ksh93-fdstatus.dif +++ b/ksh93-fdstatus.dif @@ -266,14 +266,6 @@ free(shp->fifo); --- src/cmd/ksh93/sh/array.c +++ src/cmd/ksh93/sh/array.c 2013-10-25 13:26:45.742247936 +0000 -@@ -402,6 +408,7 @@ static Namval_t *array_find(Namval_t *np - #if SHOPT_TYPEDEF - int nv_arraysettype(Namval_t *np, Namval_t *tp, const char *sub, int flags) - { -+ Shell_t *shp = sh_getinterp(); - Namval_t *nq; - char *av[2]; - int rdonly = nv_isattr(np,NV_RDONLY); @@ -438,10 +438,13 @@ int nv_arraysettype(Namval_t *np, Namval nv_offattr(nq,NV_RDONLY); if(!nv_isattr(tp,NV_BINARY)) @@ -1016,7 +1008,7 @@ sh_onstate(SH_NOLOG); @@ -876,7 +878,7 @@ Pathcomp_t *path_absolute(Shell_t *shp,r { - nv_onattr(nv_open(name,sh_subfuntree(1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE),NV_LTOU|NV_FUNCTION); + nv_onattr(nv_open(name,sh_subfuntree(shp,1),NV_NOARRAY|NV_IDENT|NV_NOSCOPE),NV_LTOU|NV_FUNCTION); funload(shp,f,name); - close(f); + sh_close(f); @@ -1533,7 +1525,16 @@ dup(savein); shp->cur_line = 0; } -@@ -2910,6 +2946,15 @@ int sh_exec(register const Shnode_t *t, +@@ -2746,7 +2782,7 @@ int sh_exec(register const Shnode_t *t, + stakdelete(slp->slptr); + if(rp->sdict) + { +- Namval_t *mp, *nq; ++ Namval_t *nq; + shp->last_root = rp->sdict; + for(mp=(Namval_t*)dtfirst(rp->sdict);mp;mp=nq) + { +@@ -2911,6 +2947,15 @@ int sh_exec(register const Shnode_t *t, break; } } @@ -1549,7 +1550,7 @@ if(shp->trapnote || (shp->exitval && sh_isstate(SH_ERREXIT)) && t && echeck) sh_chktrap(shp); -@@ -3166,7 +3211,7 @@ pid_t _sh_fork(Shell_t *shp,register pid +@@ -3167,7 +3212,7 @@ pid_t _sh_fork(Shell_t *shp,register pid { if(shp->topfd > restorefd) sh_iorestore(shp,restorefd,0); @@ -1558,7 +1559,7 @@ } } return(parent); -@@ -3478,8 +3523,7 @@ static void sh_funct(Shell_t *shp,Namval +@@ -3479,8 +3524,7 @@ static void sh_funct(Shell_t *shp,Namval struct funenv fun; char *fname = nv_getval(SH_FUNNAMENOD); struct Level *lp =(struct Level*)(SH_LEVELNOD->nvfun); @@ -1568,7 +1569,7 @@ shp->pipepid = 0; sh_stats(STAT_FUNCT); if(!lp->hdr.disc) -@@ -3522,7 +3566,6 @@ static void sh_funct(Shell_t *shp,Namval +@@ -3523,7 +3567,6 @@ static void sh_funct(Shell_t *shp,Namval lp->maxlevel = level; SH_LEVELNOD->nvalue.s = lp->maxlevel; shp->last_root = nv_dict(DOTSHNOD); @@ -1576,7 +1577,7 @@ #if 0 nv_putval(SH_FUNNAMENOD,shp->st.funname,NV_NOFREE); #else -@@ -3627,11 +3670,11 @@ static void coproc_init(Shell_t *shp, in +@@ -3628,11 +3671,11 @@ static void coproc_init(Shell_t *shp, in sh_pipe(shp->cpipe); if((outfd=shp->cpipe[1]) < 10) { @@ -1590,7 +1591,7 @@ shp->fdstatus[outfd] = IOCLOSE; shp->cpipe[1] = fd; } -@@ -3720,7 +3763,7 @@ static int run_subshell(Shell_t *shp,con +@@ -3721,7 +3764,7 @@ static int run_subshell(Shell_t *shp,con if(!shp->gd->shpath) shp->gd->shpath = pathshell(); pid = spawnveg(shp->shpath,arglist,envlist,grp); @@ -1599,7 +1600,7 @@ for(i=3; i < 10; i++) { if(shp->fdstatus[i]&IOCLEX && i!=pin && i!=pout) -@@ -4001,7 +4044,7 @@ static pid_t sh_ntfork(Shell_t *shp,cons +@@ -4002,7 +4045,7 @@ static pid_t sh_ntfork(Shell_t *shp,cons shp->gd->shpath = pathshell(); spawnpid = path_spawn(shp,shp->gd->shpath,&argv[-1],arge,pp,(grp<<1)|1); if(fd>=0) From 9a7a626faee597973c61e350f03419e04bc05af266b6751c4017d82396a49489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Mon, 11 Nov 2013 14:05:53 +0000 Subject: [PATCH 2/2] Accepting request 205161 from home:gberh:branches:shells pdksh has been removed from Factory and /etc/ksh.kshrc is now only delivered and used by ksh, thus take ownership /etc/ksh.kshrc OBS-URL: https://build.opensuse.org/request/show/205161 OBS-URL: https://build.opensuse.org/package/show/shells/ksh?expand=0&rev=187 --- ksh.changes | 6 ++++++ ksh.spec | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/ksh.changes b/ksh.changes index 4c28437..e1f934d 100644 --- a/ksh.changes +++ b/ksh.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Oct 29 17:44:05 UTC 2013 - gber@opensuse.org + +- deliver %{_sysconfdir}/ksh.kshrc as a packaged symlink on + openSUSE >= 13.2 + ------------------------------------------------------------------- Fri Oct 25 14:07:57 UTC 2013 - werner@suse.de diff --git a/ksh.spec b/ksh.spec index 1e6f795..f7169ab 100644 --- a/ksh.spec +++ b/ksh.spec @@ -670,6 +670,9 @@ fi ln -sf /%{_lib}/ast/$so %{buildroot}%{_libdir}/ast/${so%%%%.*}.so done rm -f %{buildroot}%{_libdir}/ast/*.so.* +%if %suse_version >= 1320 + ln -s %{_sysconfdir}/bash.bashrc %{buildroot}%{_sysconfdir}/ksh.kshrc +%endif sed -rn '/^\.de Af/,/^\.\./p;/^\.de aF/,/^\.\./p' man/man3/int.3 > af.man for man in $(grep -l '\.}S' man/man[138]/*.[138]); do sed -ri '1r af.man' $man @@ -754,7 +757,9 @@ fi %endif %post +%if %suse_version < 1320 test -e etc/bash.bashrc && ln -sf bash.bashrc etc/ksh.kshrc || true +%endif %if %use_suid_exe %if %{defined set_permissions} %set_permissions /%{_lib}/ast/bin/suid_exec @@ -802,6 +807,7 @@ fi %endif %postun +%if %suse_version < 1320 if test $1 -eq 0 -a ! -x bin/ksh ; then if test ! -x bin/pdksh ; then rm -f etc/ksh.kshrc @@ -810,11 +816,14 @@ if test $1 -eq 0 -a ! -x bin/ksh ; then rm -f bin/ksh %{_exec_prefix}/bin/ksh %endif fi +%endif %posttrans +%if %suse_version < 1320 if test -x bin/ksh -o -x bin/pdksh ; then test -e etc/bash.bashrc && ln -sf bash.bashrc etc/ksh.kshrc || true fi +%endif %files -f ksh.lang %defattr(-,root,root) @@ -855,6 +864,9 @@ fi %dir %{_datadir}/ksh %dir %{_datadir}/ksh/fun %{_datadir}/ksh/fun/* +%if %suse_version >= 1320 +%{_sysconfdir}/ksh.kshrc +%endif %files -n ksh-devel %defattr(-,root,root)