|
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 |
}
|