test_url_SOURCES = common/test-url.c
test_url_LDADD = $(common_LIBS)
-noinst_PROGRAMS += frob-getauxval
+noinst_PROGRAMS += \
+ frob-getauxval \
+ frob-getenv \
+ $(NULL)
frob_getauxval_SOURCES = common/frob-getauxval.c
frob_getauxval_LDADD = $(common_LIBS)
+
+frob_getenv_SOURCES = common/frob-getenv.c
+frob_getenv_LDADD = $(common_LIBS)
#endif /* HAVE_GETAUXVAL */
+char *
+secure_getenv (const char *name)
+{
+ if (getauxval (AT_SECURE))
+ return NULL;
+ return getenv (name);
+}
+
#ifndef HAVE_STRERROR_R
int
#endif /* !HAVE_GETAUXVAL */
+char * secure_getenv (const char *name);
+
#ifndef HAVE_STRERROR_R
int strerror_r (int errnum,
#include "config.h"
+#include "compat.h"
#include "debug.h"
#include <assert.h>
const char *q;
int i;
- env = getenv ("P11_KIT_STRICT");
+ env = secure_getenv ("P11_KIT_STRICT");
if (env && env[0] != '\0')
debug_strict = true;
--- /dev/null
+/*
+ * Copyright (c) 2014 Red Hat Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and
+ * the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ * * The names of contributors to this software may not be
+ * used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Author: Stef Walter <stefw@gnome.org>
+ */
+
+#include "config.h"
+#include "compat.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ int ret;
+ const char *val;
+
+fprintf (stderr, "calling secure_getenv(%s) getenv(%s) = %s\n", argv[1], argv[1], getenv(argv[1]));
+ val = secure_getenv (argv[1]);
+ if (val == NULL) {
+ printf ("%s=NULL\n", argv[1]);
+ return 0;
+ }
+
+ ret = atoi (val);
+ if (ret == 0) {
+ fprintf (stderr, "usage: frob-getenv VAR");
+ abort ();
+ }
+
+ printf ("%s=%d\n", argv[1], ret);
+ return ret;
+}
free (path);
}
+static void
+test_secure_getenv (void)
+{
+ const char *args[] = { BUILDDIR "/frob-getenv", "BLAH", NULL };
+ char *path;
+ int ret;
+
+ setenv ("BLAH", "5", 1);
+
+ ret = p11_test_run_child (args, true);
+ assert_num_eq (ret, 5);
+
+ path = p11_test_copy_setgid (args[0]);
+ if (path == NULL)
+ return;
+
+ args[0] = path;
+ ret = p11_test_run_child (args, true);
+ assert_num_cmp (ret, ==, 0);
+
+/* if (unlink (path) < 0)
+ assert_fail ("unlink failed", strerror (errno));
+ */
+ free (path);
+}
+
static void
test_mmap (void)
{
/* Don't run this test when under fakeroot */
if (!getenv ("FAKED_MODE")) {
p11_test (test_getauxval, "/compat/getauxval");
+ p11_test (test_secure_getenv, "/compat/secure_getenv");
}
p11_test (test_mmap, "/compat/mmap");
#endif
{
const char *env;
- env = getenv ("TMPDIR");
+ env = secure_getenv ("TMPDIR");
if (env && env[0]) {
return p11_path_build (env, name, NULL);
AC_CHECK_HEADERS([sys/resource.h])
AC_CHECK_MEMBERS([struct dirent.d_type],,,[#include <dirent.h>])
AC_CHECK_FUNCS([getprogname getexecname basename mkstemp mkdtemp])
- AC_CHECK_FUNCS([getauxval issetugid getresuid])
+ AC_CHECK_FUNCS([getauxval issetugid getresuid secure_getenv])
AC_CHECK_FUNCS([strnstr memdup strndup strerror_r])
AC_CHECK_FUNCS([asprintf vasprintf vsnprintf])
AC_CHECK_FUNCS([timegm])