linux-sysprog · beginner · ~15 min
Safely validate and parse process environment variables with fallback defaults.
Process environment variables read via getenv() are untrusted user-controlled strings. A defensive parser converts strings to integers using strtol, checking for empty inputs, non-numeric characters, and arithmetic overflow.
Implement:
int parse_env_int(const char *env_val, int default_val, int min_val, int max_val, int *out);
out == NULL, return -1.env_val == NULL or env_val[0] == '\0', set *out = default_val and return 0.env_val with strtol(env_val, &endptr, 10).endptr == env_val (no digits found) or *endptr != '\0' (trailing garbage characters), set *out = default_val and return -1.< min_val or > max_val, set *out = default_val and return -1.*out = (int)parsed_val and return 0.int port = 0;
parse_env_int("8080", 3000, 1, 65535, &port); // returns 0, port == 8080
parse_env_int("invalid", 3000, 1, 65535, &port); // returns -1, port == 3000
env_val: string from getenv; defaults and bounds: int; out: pointer to int.
Returns 0 on valid parse/fallback, -1 on parse failure/out of range.
Must use strtol with endptr check. No atoi.
#include <stddef.h>
#include <stdlib.h>
int parse_env_int(const char *env_val, int default_val, int min_val, int max_val, int *out) {
(void)env_val; (void)default_val; (void)min_val; (void)max_val; (void)out;
return -1;
}
Using atoi (which has undefined behavior on overflow and no error reporting); ignoring endptr.
NULL string uses default and returns 0; trailing non-digits like "123abc" fail with -1; out of range values fail.
Solve this exercise in the browser editor — compile and run against the test harness, no setup required.