VirtualBox

Changeset 3569 in kBuild


Ignore:
Timestamp:
Jul 9, 2022 1:26:29 PM (3 years ago)
Author:
bird
Message:

kash: Some variable handling fixes that showed up when using 'local' on stuff in a shell function (RemoveDirFromPath in vbox' tools/env.sh).

Location:
trunk/src/kash
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/shinstance.c

    r3506 r3569  
    489489        {
    490490            struct localvar *next = lvar->next;
    491                         if (!(lvar->flags & VTEXTFIXED))
     491            if (!(lvar->flags & VTEXTFIXED))
    492492                sh_free(psh, lvar->text);
    493493            sh_free(psh, lvar);
     
    509509                if (!(var->flags & (VTEXTFIXED | VSTACK)))
    510510                    sh_free(psh, var->text);
    511                 if (!(var->flags & VSTRFIXED))
     511                if (!(var->flags & (VSTRFIXED | VSTRFIXED2)))
    512512                    sh_free(psh, var);
    513513                var = next;
  • trunk/src/kash/var.c

    r3477 r3569  
    137137const struct varinit varinit[] = {
    138138#if ATTY
    139         { offsetof(shinstance, vatty),  VSTRFIXED|VTEXTFIXED|VUNSET,    "ATTY=",
     139        { offsetof(shinstance, vatty),  VSTRFIXED|VSTRFIXED2|VTEXTFIXED|VUNSET, "ATTY=",
    140140          NULL },
    141141#endif
    142142#ifndef SMALL
    143         { offsetof(shinstance, vhistsize),      VSTRFIXED|VTEXTFIXED|VUNSET,    "HISTSIZE=",
     143        { offsetof(shinstance, vhistsize),      VSTRFIXED|VSTRFIXED2|VTEXTFIXED|VUNSET, "HISTSIZE=",
    144144          sethistsize },
    145145#endif
    146         { offsetof(shinstance, vifs),   VSTRFIXED|VTEXTFIXED,           "IFS= \t\n",
     146        { offsetof(shinstance, vifs),   VSTRFIXED|VSTRFIXED2|VTEXTFIXED,                "IFS= \t\n",
    147147          NULL },
    148         { offsetof(shinstance, vmail),  VSTRFIXED|VTEXTFIXED|VUNSET,    "MAIL=",
     148        { offsetof(shinstance, vmail),  VSTRFIXED|VSTRFIXED2|VTEXTFIXED|VUNSET, "MAIL=",
    149149          NULL },
    150         { offsetof(shinstance, vmpath), VSTRFIXED|VTEXTFIXED|VUNSET,    "MAILPATH=",
     150        { offsetof(shinstance, vmpath), VSTRFIXED|VSTRFIXED2|VTEXTFIXED|VUNSET, "MAILPATH=",
    151151          NULL },
    152         { offsetof(shinstance, vpath),  VSTRFIXED|VTEXTFIXED,           "PATH=" _PATH_DEFPATH,
     152        { offsetof(shinstance, vpath),  VSTRFIXED|VSTRFIXED2|VTEXTFIXED,                "PATH=" _PATH_DEFPATH,
    153153          changepath },
    154154        /*
    155155         * vps1 depends on uid
    156156         */
    157         { offsetof(shinstance, vps2),   VSTRFIXED|VTEXTFIXED,           "PS2=> ",
     157        { offsetof(shinstance, vps2),   VSTRFIXED|VSTRFIXED2|VTEXTFIXED,                "PS2=> ",
    158158          NULL },
    159         { offsetof(shinstance, vps4),   VSTRFIXED|VTEXTFIXED,           "PS4=+ ",
     159        { offsetof(shinstance, vps4),   VSTRFIXED|VSTRFIXED2|VTEXTFIXED,                "PS4=+ ",
    160160          NULL },
    161161#ifndef SMALL
    162         { offsetof(shinstance, vterm),  VSTRFIXED|VTEXTFIXED|VUNSET,    "TERM=",
     162        { offsetof(shinstance, vterm),  VSTRFIXED|VSTRFIXED2|VTEXTFIXED|VUNSET, "TERM=",
    163163          setterm },
    164164#endif
    165         { offsetof(shinstance, voptind),        VSTRFIXED|VTEXTFIXED|VNOFUNC,   "OPTIND=1",
     165        { offsetof(shinstance, voptind),        VSTRFIXED|VSTRFIXED2|VTEXTFIXED|VNOFUNC,        "OPTIND=1",
    166166          getoptsreset },
    167167        { 0,    0,                              NULL,
     
    212212        for (i = 0; i < 4; i++)
    213213        {
    214                 psh->libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH;
     214                psh->libpath_vars[i].flags = VSTRFIXED | VSTRFIXED2 | VOS2LIBPATH;
    215215                psh->libpath_vars[i].func = NULL;
    216216
     
    236236                {
    237237                        psh->libpath_vars[i].flags |= VUNSET | VTEXTFIXED;
    238                         psh->libpath_vars[i].text = (char*)libpath_envs[i];
     238                        psh->libpath_vars[i].text = (char *)libpath_envs[i];
    239239                }
    240240                if (find_var(psh, psh->libpath_vars[i].text, &vpp, &psh->libpath_vars[i].name_len) != NULL)
     
    267267                psh->vps1.text = sh_strdup(psh, sh_geteuid(psh) ? "PS1=$ " : "PS1=# ");
    268268#endif
    269                 psh->vps1.flags = VSTRFIXED|VTEXTFIXED;
     269                psh->vps1.flags = VSTRFIXED|VSTRFIXED2|VTEXTFIXED; /** @todo text isn't fixed here... */
    270270        }
    271271}
     
    282282        for (i = 0; i < K_ELEMENTS(inherit->vartab); i++) {
    283283                struct var const *vsrc = inherit->vartab[i];
    284                 if (!vsrc) {
    285                 } else {
     284                if (vsrc) {
    286285                        struct var **ppdst = &psh->vartab[i];
    287286                        do
    288287                        {
    289288                                struct var *dst;
    290                                 if (!(vsrc->flags & VSTRFIXED)) {
     289                                if (!(vsrc->flags & VSTRFIXED2)) {
    291290                                        dst = (struct var *)ckmalloc(psh, sizeof(*dst));
     291                                        *dst = *vsrc;
     292                                        dst->flags &= ~VSTRFIXED;
    292293                                } else {
    293                                         /* VSTRFIXED is used when the structure is a fixed allocation in
     294                                        /* VSTRFIXED2 is used when the structure is a fixed allocation in
    294295                                           the shinstance structure, so scan those to find which it is: */
    295296                                        size_t            left     = ((struct var *)&inherit->vartab[0] - &inherit->vatty);
     
    303304                                                        break;
    304305                                        kHlpAssert(left < 256 /*whatever, just no rollover*/);
     306                                        *dst = *vsrc;
    305307                                }
    306                                 *dst = *vsrc;
    307308
    308309                                if (!(vsrc->flags & VTEXTFIXED)) {
     
    328329                        struct localvar *dst = ckmalloc(psh, sizeof(*dst));
    329330
    330                         dst->flags = vsrc->flags & ~VSTACK;
    331                         if (vsrc->flags & VTEXTFIXED)
    332                                 dst->text = savestr(psh, vsrc->text);
     331                        dst->flags = vsrc->flags & ~(VSTACK | VTEXTFIXED | (vsrc->flags & VSTRFIXED2 ? 0 : VSTRFIXED));
     332                        if (vsrc->text)
     333                            dst->text = savestr(psh, vsrc->text);
    333334                        else
    334                                 dst->text = vsrc->text;
    335 
     335                        {
     336                            dst->text = NULL;
     337                            dst->flags |= vsrc->flags & VTEXTFIXED;
     338                        }
    336339                        dst->vp = find_var(psh, vsrc->vp->text, NULL, NULL);
    337340                        kHlpAssert(dst->vp);
     
    342345                        vsrc = vsrc->next;
    343346                } while (vsrc);
     347                *ppdst = NULL;
    344348        }
    345349}
     
    630634                                if ((vp->flags & VTEXTFIXED) == 0)
    631635                                        ckfree(psh, vp->text);
    632                                 if ((vp->flags & VSTRFIXED) == 0)
     636                                if ((vp->flags & (VSTRFIXED | VSTRFIXED2)) == 0)
    633637                                        ckfree(psh, vp);
    634638                        } else {
     
    948952                vp->flags &= ~VEXPORT;
    949953                vp->flags |= VUNSET;
    950                 if ((vp->flags & VSTRFIXED) == 0) {
     954                if ((vp->flags & (VSTRFIXED | VSTRFIXED2)) == 0) {
    951955                        if ((vp->flags & VTEXTFIXED) == 0)
    952956                                ckfree(psh, vp->text);
  • trunk/src/kash/var.h

    r3438 r3569  
    5151#define VNOFUNC         0x40    /* don't call the callback function */
    5252#define VNOSET          0x80    /* do not set variable - just readonly test */
     53#define VSTRFIXED2      0x4000  /* variable struct is in the shinstance, cannot be freed. (VSTRFIXED is mixed up in local vars) */
    5354#ifdef PC_OS2_LIBPATHS
    5455#define VOS2LIBPATH     0x8000  /* OS/2 LIBPATH related variable. */
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette