How do i free allocated memory for environ in C?

124 Views Asked by At

I'm trying to implement built-in function like setenv, getenv and unsetenv. All work well with getenv but i really don't how to free memory that i allocated with _setenv.

Here is my code for _setenv :

char *_setenv(const char *name, const char *value, int overwrite)
{
    long int i = -1;
    char *var = NULL;
    int var_len = 0, name_len = 0;
    char **new_env = NULL;

    if (name == NULL || value == NULL)
        return (NULL);
    var = _getenv(name);
    if (var != NULL && overwrite == 0)
        return (var);

    var_len = strlen(value);
    name_len = strlen(name);
    var = (char *)malloc(sizeof(char) * (name_len + var_len + 2));
    memcpy(var, name, name_len);
    strcat(var, "=");
    strncat(var, value, var_len);

    if (var != NULL && overwrite != 0)
        environ[i] = var;
    else
    {
        long int env_len = get_env_length(environ);

        new_env = (char **)malloc(sizeof(*new_env) * (env_len + 2));
        for (i = 0; i < env_len; i++)
        {
            int var_len = strlen(environ[i]);

            new_env[i] = (char *)malloc(sizeof(*new_env[i]) * var_len + 1);
            memcpy(new_env[i], environ[i], var_len);
            new_env[i][var_len + 1] = '\0';
        }
        new_env[env_len + 1] = var;
        new_env[env_len + 2] = NULL;
    }
    return (var);
}

I made this _free_env to free the allocated memory but it keep returning an error about invalid pointer:

int _free_env(void)
{
    int res = 0, i = 0;

    for (i = 0; environ[i]; i++)
        free(environ[i]);

    free(environ);
    return (res);
}

I guess it's about environ variables that i have not allocated myself, but since i need to free memory i allocate in the case i overwrite or add a variable, it is very difficult. Can you help me please ?

PS: _getenv is a my custom version of the built-in getenv and get_env_length is a function that get the number of variables in environ

0

There are 0 best solutions below