Projects
Mega:23.03
ksh
_service:tar_scm:backport-functions-with-not-lo...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:backport-functions-with-not-loaded-autoloaded-functions.patch of Package ksh
From a82279db9e49d2c42a95853f38061494df06e33c Mon Sep 17 00:00:00 2001 From: Kurtis Rader <krader@skepticism.us> Date: Tue, 12 Nov 2019 19:45:34 -0800 Subject: [PATCH] `functions` with not loaded autoloaded functions If there are functions marked to be autloaded, but not yet loaded, typing `typeset -f` or `functions` dereferences a NULL pointer. Fixes #1436 (cherry picked from commit 7df11dedc5883fa2be1cf217ae6021cac56c81fa) --- src/cmd/ksh93/bltins/typeset.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/cmd/ksh93/bltins/typeset.c b/src/cmd/ksh93/bltins/typeset.c index 0862ace4..fba305f1 100644 --- a/src/cmd/ksh93/bltins/typeset.c +++ b/src/cmd/ksh93/bltins/typeset.c @@ -716,7 +716,6 @@ int setall(char **argv, nvflag_t flag, Dt_t *troot, struct tdata *tp) { static_fn int print_namval(Sfio_t *file, Namval_t *np, bool omit_attrs, struct tdata *tp) { char *cp; int indent = tp->indent, outname = 0, isfun; - struct Ufunction *rp; sh_sigcheck(tp->sh); if (tp->noref && nv_isref(np)) return 0; @@ -749,11 +748,13 @@ static_fn int print_namval(Sfio_t *file, Namval_t *np, bool omit_attrs, struct t } } if (isfun) { + struct Ufunction *rp = FETCH_VT(np->nvalue, rp); Sfio_t *iop = NULL; char *fname = NULL; + if (nv_isattr(np, NV_NOFREE)) return 0; if (!omit_attrs) { - if (!FETCH_VT(np->nvalue, ip)) { + if (!rp) { sfputr(file, "typeset -fu", ' '); } else if (!nv_isattr(np, NV_FPOSIX)) { sfputr(file, "function", ' '); @@ -763,14 +764,16 @@ static_fn int print_namval(Sfio_t *file, Namval_t *np, bool omit_attrs, struct t if (tp->wctname) cp += strlen(tp->wctname) + 1; sfputr(file, cp, -1); if (nv_isattr(np, NV_FPOSIX)) sfwrite(file, "()", 2); - rp = FETCH_VT(np->nvalue, rp); + + // Has the function been defined in which case we know where it came from? Or just marked + // to be autoloaded in which case we know we can't print the definition of the function? if (rp && rp->hoffset >= 0) { fname = rp->fname; } else { - omit_attrs = false; + omit_attrs = true; } + if (omit_attrs) { - rp = FETCH_VT(np->nvalue, rp); if (tp->pflag && rp && rp->hoffset >= 0) { sfprintf(file, " #line %d %s\n", rp->lineno, fname ? sh_fmtq(fname) : ""); } else { @@ -778,7 +781,7 @@ static_fn int print_namval(Sfio_t *file, Namval_t *np, bool omit_attrs, struct t } } else { if (nv_isattr(np, NV_FTMP)) { - fname = 0; + fname = NULL; iop = tp->sh->heredocs; } else if (fname) { iop = sfopen(iop, fname, "r"); -- 2.19.1
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2