VirtualBox

Changeset 3057 in kBuild


Ignore:
Timestamp:
Sep 15, 2017 6:06:42 AM (8 years ago)
Author:
bird
Message:

kash: rewrite kmk_builtin_% to kmk_% on the fly to allow harmless mixing of external and builtin kmk commands.

File:
1 edited

Legend:

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

    r2652 r3057  
    122122        char *cmdname;
    123123        int e;
     124        const char *argv0 = argv[0];
     125        int argv0len = (int)strlen(argv0);
     126        char kmkcmd[48];
    124127#ifdef PC_EXE_EXTS
    125         int has_ext = (int)strlen(argv[0]) - 4;
     128        int has_ext = argv0len - 4;
    126129        has_ext = has_ext > 0
    127             && argv[0][has_ext] == '.'
     130            && argv0[has_ext] == '.'
    128131            /* use strstr and upper/lower permuated extensions to avoid multiple strcasecmp calls. */
    129132            && strstr("exe;" "Exe;" "EXe;" "EXE;" "ExE;" "eXe;" "eXE;" "exE;"
     
    132135                      "bat;" "Bat;" "BAt;" "BAT;" "BaT;" "bAt;" "bAT;" "baT;"
    133136                      "btm;" "Btm;" "BTm;" "BTM;" "BtM;" "bTm;" "bTM;" "btM;",
    134                       argv[0] + has_ext + 1)
     137                      argv0 + has_ext + 1)
    135138               != NULL;
    136139#else
    137140        const int has_ext = 1;
    138141#endif
    139         TRACE((psh, "shellexec: argv[0]=%s idx=%d\n", argv[0], idx));
    140         if (strchr(argv[0], '/') != NULL) {
    141                 cmdname = stalloc(psh, strlen(argv[0]) + 5);
    142                 strcpy(cmdname, argv[0]);
     142        TRACE((psh, "shellexec: argv[0]=%s idx=%d\n", argv0, idx));
     143        if (strchr(argv0, '/') != NULL) {
     144                cmdname = stalloc(psh, argv0len + 5);
     145                strcpy(cmdname, argv0);
    143146                tryexec(psh, cmdname, argv, envp, vforked, has_ext);
    144147                TRACE((psh, "shellexec: cmdname=%s\n", cmdname));
     
    146149                e = errno;
    147150        } else {
     151                /* Before we search the PATH, transform kmk_builtin_% to kmk_% so we don't
     152                   need to be too careful mixing internal and external kmk command. */
     153                if (   argv0len > 12
     154                    && argv0len < 42
     155                    && strncmp(argv0, "kmk_builtin_", 12) == 0
     156                    && strpbrk(argv0 + 12, "./\\-:;<>") == NULL) {
     157                        memcpy(kmkcmd, "kmk_", 4);
     158                        memcpy(&kmkcmd[4], argv0 + 12, argv0len + 1 - 8);
     159                        TRACE((psh, "shellexec: dropped '_builtin' from %s to %s\n", argv0, kmkcmd));
     160                        argv0len -= 8;
     161                        argv0 = kmkcmd;
     162                }
     163
    148164                e = ENOENT;
    149                 while ((cmdname = padvance(psh, &path, argv[0])) != NULL) {
     165                while ((cmdname = padvance(psh, &path, argv0)) != NULL) {
    150166                        if (--idx < 0 && psh->pathopt == NULL) {
    151167                                tryexec(psh, cmdname, argv, envp, vforked, has_ext);
     
    553569        int e;
    554570        int (*bltin)(shinstance*,int,char **);
    555 
     571        int argv0len = (int)strlen(name);
     572        char kmkcmd[48];
    556573#ifdef PC_EXE_EXTS
    557         int has_ext = (int)(strlen(name) - 4);
     574        int has_ext = argv0len - 4;
    558575        has_ext = has_ext > 0
    559576            && name[has_ext] == '.'
     
    638655                else
    639656                        prev = cmdp->param.index;
     657        }
     658
     659        /* Before we search the PATH, transform kmk_builtin_% to kmk_% so we don't
     660           need to be too careful mixing internal and external kmk command. */
     661        if (   argv0len > 12
     662            && argv0len < (int)sizeof(kmkcmd)
     663            && strncmp(name, "kmk_builtin_", 12) == 0
     664            && strpbrk(name + 12, "./\\-:;<>") == NULL) {
     665                memcpy(kmkcmd, "kmk_", 4);
     666                memcpy(&kmkcmd[4], name + 12, argv0len + 1 - 8);
     667                TRACE((psh, "find_command: dropped '_builtin' from %s to %s\n", name, kmkcmd));
     668                argv0len -= 8;
     669                name = kmkcmd;
    640670        }
    641671
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