Blame common-src/alloc.c

Packit Service 392537
/*
Packit Service 392537
 * Amanda, The Advanced Maryland Automatic Network Disk Archiver
Packit Service 392537
 * Copyright (c) 1991-1999 University of Maryland at College Park
Packit Service 392537
 * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
Packit Service 392537
 * Copyright (c) 2013-2016 Carbonite, Inc.  All Rights Reserved.
Packit Service 392537
 * All Rights Reserved.
Packit Service 392537
 *
Packit Service 392537
 * Permission to use, copy, modify, distribute, and sell this software and its
Packit Service 392537
 * documentation for any purpose is hereby granted without fee, provided that
Packit Service 392537
 * the above copyright notice appear in all copies and that both that
Packit Service 392537
 * copyright notice and this permission notice appear in supporting
Packit Service 392537
 * documentation, and that the name of U.M. not be used in advertising or
Packit Service 392537
 * publicity pertaining to distribution of the software without specific,
Packit Service 392537
 * written prior permission.  U.M. makes no representations about the
Packit Service 392537
 * suitability of this software for any purpose.  It is provided "as is"
Packit Service 392537
 * without express or implied warranty.
Packit Service 392537
 *
Packit Service 392537
 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
Packit Service 392537
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
Packit Service 392537
 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit Service 392537
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
Packit Service 392537
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
Packit Service 392537
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit Service 392537
 *
Packit Service 392537
 * Authors: the Amanda Development Team.  Its members are listed in a
Packit Service 392537
 * file named AUTHORS, in the root directory of this distribution.
Packit Service 392537
 */
Packit Service 392537
/*
Packit Service 392537
 * $Id: g_malloc.c 5280 2007-02-13 15:58:56Z martineau $
Packit Service 392537
 *
Packit Service 392537
 * Memory allocators with error handling.  If the allocation fails,
Packit Service 392537
 * errordump() is called, relieving the caller from checking the return
Packit Service 392537
 * code
Packit Service 392537
 */
Packit Service 392537
#include "amanda.h"
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * safe_env_full - build a "safe" environment list.
Packit Service 392537
 */
Packit Service 392537
char **
Packit Service 392537
safe_env_full(char **add)
Packit Service 392537
{
Packit Service 392537
    gboolean keep_all_env;
Packit Service 392537
    static char *safe_env_list[] = {
Packit Service 392537
	"TZ",
Packit Service 392537
#ifdef __CYGWIN__
Packit Service 392537
	"SYSTEMROOT",
Packit Service 392537
#endif
Packit Service 392537
#ifdef NEED_PATH_ENV
Packit Service 392537
	"PATH",
Packit Service 392537
#endif
Packit Service 392537
	"DISPLAY",
Packit Service 392537
#ifdef NEED_LD_LIBRARY_PATH_ENV
Packit Service 392537
	"LD_LIBRARY_PATH",
Packit Service 392537
#endif
Packit Service 392537
	NULL
Packit Service 392537
    };
Packit Service 392537
Packit Service 392537
    /*
Packit Service 392537
     * If the initial environment pointer malloc fails, set up to
Packit Service 392537
     * pass back a pointer to the NULL string pointer at the end of
Packit Service 392537
     * safe_env_list so our result is always a valid, although possibly
Packit Service 392537
     * empty, environment list.
Packit Service 392537
     */
Packit Service 392537
    char **envp = safe_env_list + G_N_ELEMENTS(safe_env_list) - 1;
Packit Service 392537
Packit Service 392537
    char **p;
Packit Service 392537
    char **q;
Packit Service 392537
    char *s;
Packit Service 392537
    char *v;
Packit Service 392537
    size_t l1, l2;
Packit Service 392537
    char **env;
Packit Service 392537
    int    env_cnt;
Packit Service 392537
    int nadd = 0;
Packit Service 392537
Packit Service 392537
    /* count ADD */
Packit Service 392537
    for (p = add; p && *p; p++)
Packit Service 392537
	nadd++;
Packit Service 392537
Packit Service 392537
#ifdef FAILURE_CODE
Packit Service 392537
    keep_all_env = TRUE;
Packit Service 392537
#else
Packit Service 392537
    keep_all_env = (getuid() == geteuid() && getgid() == getegid());
Packit Service 392537
#endif
Packit Service 392537
    if (keep_all_env) {
Packit Service 392537
	env_cnt = 1;
Packit Service 392537
	for (env = environ; *env != NULL; env++)
Packit Service 392537
	    env_cnt++;
Packit Service 392537
	if ((q = (char **)malloc((nadd+env_cnt)*sizeof(char *))) != NULL) {
Packit Service 392537
	    envp = q;
Packit Service 392537
	    p = envp;
Packit Service 392537
	    /* copy in ADD */
Packit Service 392537
	    for (env = add; env && *env; env++) {
Packit Service 392537
		*p = *env;
Packit Service 392537
		p++;
Packit Service 392537
	    }
Packit Service 392537
	    for (env = environ; *env != NULL; env++) {
Packit Service 392537
#ifdef FAILURE_CODE
Packit Service 392537
		{
Packit Service 392537
#else
Packit Service 392537
		if (strncmp("LANG=", *env, 5) != 0 &&
Packit Service 392537
		    strncmp("LC_", *env, 3) != 0) {
Packit Service 392537
#endif
Packit Service 392537
		    *p = g_strdup(*env);
Packit Service 392537
		    p++;
Packit Service 392537
		}
Packit Service 392537
	    }
Packit Service 392537
	    *p = NULL;
Packit Service 392537
	}
Packit Service 392537
	return envp;
Packit Service 392537
    }
Packit Service 392537
Packit Service 392537
    if ((q = (char **)malloc(nadd*sizeof(char *) + sizeof(safe_env_list))) != NULL) {
Packit Service 392537
	envp = q;
Packit Service 392537
	/* copy in ADD */
Packit Service 392537
	for (p = add; p && *p; p++) {
Packit Service 392537
	    *q = *p;
Packit Service 392537
	    q++;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	/* and copy any SAFE_ENV that are already set */
Packit Service 392537
	for (p = safe_env_list; *p != NULL; p++) {
Packit Service 392537
	    if ((v = getenv(*p)) == NULL) {
Packit Service 392537
		continue;			/* no variable to dup */
Packit Service 392537
	    }
Packit Service 392537
	    l1 = strlen(*p);			/* variable name w/o null */
Packit Service 392537
	    l2 = strlen(v) + 1;			/* include null byte here */
Packit Service 392537
	    if ((s = (char *)malloc(l1 + 1 + l2)) == NULL) {
Packit Service 392537
		break;				/* out of memory */
Packit Service 392537
	    }
Packit Service 392537
	    *q++ = s;				/* save the new pointer */
Packit Service 392537
	    memcpy(s, *p, l1);			/* left hand side */
Packit Service 392537
	    s += l1;
Packit Service 392537
	    *s++ = '=';
Packit Service 392537
	    memcpy(s, v, l2);			/* right hand side and null */
Packit Service 392537
	}
Packit Service 392537
	*q = NULL;				/* terminate the list */
Packit Service 392537
    }
Packit Service 392537
    return envp;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
free_env(
Packit Service 392537
    char **env)
Packit Service 392537
{
Packit Service 392537
    char **p;
Packit Service 392537
Packit Service 392537
    for (p = env; *p != NULL; p++) {
Packit Service 392537
	g_free(*p);
Packit Service 392537
    }
Packit Service 392537
    g_free(env);
Packit Service 392537
}