...
Code Block | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
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 |
...