Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
bgColor#ffcccc
char *env = getenv("TEST_ENV");
env[0] = 'a';

Compliant Solution

...

(local copy)

For the case where the intent of the non-compliant code example is to use the modified value of the environment variable locally and not modify the environment, this compliant solution makes This is a compliant code solution. If it is necessary to modify the value of the string returned by the function getenv(), then the programmer should make a local copy of that string value, and then modify modifies the local copy of that string.

Code Block
bgColor#ccccFF
const char *env;
char *copy_of_env;

if ((env = getenv("TEST_ENV")) != NULL) {
   copy_of_env = (char *)malloc(strlen(env) + 1);

   if (copy_of_env != NULL) {
      strcpy(copy_of_env, env);
   }
   else {
      /* Error handling */
   }

   copy_of_env[0] = 'a';
}

Compliant Solution (modifying the environment in POSIX)

For the case where the intent of the non-compliant code example is to modify the environment, this compliant solution will perform that action using the POSIX putenv() function.

Code Block
bgColor#ccccFF

const char *env;
char *copy_of_env;

if ((env = getenv("TEST_ENV")) != NULL) {
   copy_of_env = (char *)malloc(sizeof("TEST_ENV=") + strlen(env));

   if (copy_of_env != NULL) {
      strcpy(copy_of_env, "TEST_ENV=");
      strcat(copy_of_env, env);
      copy_of_env[sizeof("TEST_ENV=") - 1] = 'a';
      if (putenv(copy_of_env) != 0) {
        /* handle error */
      }
   }
   else {
      /* Error handling */
   }
}

Risk Assessment

The modified string may be overwritten by a subsequent call to the getenv() function.  Depending on the implementation, modifying the string returned by getenv() may or may not modify the environment.

Rule

Severity 

Likelihood 

Remediation Cost

Priority

Level

ENV30-C

1 (low)

1 (unlikely)

3 (low)

P3

L3

...