VirtualBox

Ignore:
Timestamp:
Feb 23, 2018 9:33:27 PM (7 years ago)
Author:
bird
Message:

kBuiltinOptEnvAppendPrepend: Fixed heap corruption found by Vitali. Cleaned up confused code around it.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/common-env-and-cwd-opt.c

    r3039 r3133  
    186186                && pszCur[cchVar] == '=')
    187187            {
    188                 size_t cchOldValue = strlen(papszEnv[iEnvVar]) - cchVar - 1;
    189                 size_t cchNewValue = strlen(pszValue)          - cchVar - 1;
    190                 char *pszNew = malloc(cchVar + 1 + cchOldValue + cchNewValue);
    191                 if (!papszEnv[iEnvVar])
     188                size_t cchOldValue = strlen(pszCur)  - cchVar - 1;
     189                size_t cchNewValue = strlen(pszValue) - cchVar - 1;
     190                char  *pszNew      = malloc(cchVar + 1 + cchOldValue + cchNewValue + 1);
     191                if (!pszNew)
    192192                    return errx(1, "out of memory!");
    193193                if (fAppend)
    194194                {
    195                     memcpy(pszNew, papszEnv[iEnvVar], cchVar + 1 + cchOldValue);
     195                    memcpy(pszNew, pszCur, cchVar + 1 + cchOldValue);
    196196                    memcpy(&pszNew[cchVar + 1 + cchOldValue], &pszValue[cchVar + 1], cchNewValue + 1);
    197197                }
    198198                else
    199199                {
    200                     memcpy(pszNew, papszEnv[iEnvVar], cchVar + 1); /* preserve variable name case  */
     200                    memcpy(pszNew, pszCur, cchVar + 1); /* preserve variable name case  */
    201201                    memcpy(&pszNew[cchVar + 1], &pszValue[cchVar + 1], cchNewValue);
    202                     memcpy(&pszNew[cchVar + 1 + cchNewValue], &papszEnv[iEnvVar][cchVar + 1], cchOldValue + 1);
     202                    memcpy(&pszNew[cchVar + 1 + cchNewValue], &pszCur[cchVar + 1], cchOldValue + 1);
    203203                }
    204204
    205205                if (cVerbosity > 0)
    206                     warnx("replacing '%s' with '%s'", papszEnv[iEnvVar], pszNew);
    207                 free(papszEnv[iEnvVar]);
     206                    warnx("replacing '%s' with '%s'", pszCur, pszNew);
     207                free(pszCur);
    208208                papszEnv[iEnvVar] = pszNew;
    209209
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