1309466Sngie/* $NetBSD: t_getenv.c,v 1.3 2015/02/27 08:55:35 martin Exp $ */ 2272343Sngie 3272343Sngie/*- 4272343Sngie * Copyright (c) 2010 The NetBSD Foundation, Inc. 5272343Sngie * All rights reserved. 6272343Sngie * 7272343Sngie * This code is derived from software contributed to The NetBSD Foundation 8272343Sngie * by Christos Zoulas 9272343Sngie * 10272343Sngie * Redistribution and use in source and binary forms, with or without 11272343Sngie * modification, are permitted provided that the following conditions 12272343Sngie * are met: 13272343Sngie * 14272343Sngie * 1. Redistributions of source code must retain the above copyright 15272343Sngie * notice, this list of conditions and the following disclaimer. 16272343Sngie * 2. Redistributions in binary form must reproduce the above copyright 17272343Sngie * notice, this list of conditions and the following disclaimer in 18272343Sngie * the documentation and/or other materials provided with the 19272343Sngie * distribution. 20272343Sngie * 21272343Sngie * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23272343Sngie * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24272343Sngie * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25272343Sngie * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26272343Sngie * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27272343Sngie * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28272343Sngie * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29272343Sngie * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30272343Sngie * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31272343Sngie * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32272343Sngie * SUCH DAMAGE. 33272343Sngie */ 34272343Sngie 35272343Sngie#include <sys/cdefs.h> 36309466Sngie__RCSID("$NetBSD: t_getenv.c,v 1.3 2015/02/27 08:55:35 martin Exp $"); 37272343Sngie 38272343Sngie#include <atf-c.h> 39272343Sngie#include <errno.h> 40272343Sngie#include <stdio.h> 41272343Sngie#include <stdlib.h> 42272343Sngie#include <string.h> 43274626Sngie#ifdef __FreeBSD__ 44272891Sngie#include <signal.h> 45272891Sngie#endif 46272343Sngie 47272343Sngieextern char **environ; 48272343Sngie 49272343SngieATF_TC(clearenv_basic); 50272343SngieATF_TC_HEAD(clearenv_basic, tc) 51272343Sngie{ 52272343Sngie atf_tc_set_md_var(tc, "descr", 53272343Sngie "Test user clearing environment directly"); 54272343Sngie} 55272343Sngie 56272343SngieATF_TC_BODY(clearenv_basic, tc) 57272343Sngie{ 58272343Sngie char name[1024], value[1024]; 59272343Sngie 60272343Sngie for (size_t i = 0; i < 1024; i++) { 61272343Sngie snprintf(name, sizeof(name), "crap%zu", i); 62272343Sngie snprintf(value, sizeof(value), "%zu", i); 63272343Sngie ATF_CHECK(setenv(name, value, 1) != -1); 64272343Sngie } 65272343Sngie 66272343Sngie *environ = NULL; 67272343Sngie 68272343Sngie for (size_t i = 0; i < 1; i++) { 69272343Sngie snprintf(name, sizeof(name), "crap%zu", i); 70272343Sngie snprintf(value, sizeof(value), "%zu", i); 71272343Sngie ATF_CHECK(setenv(name, value, 1) != -1); 72272343Sngie } 73272343Sngie 74272343Sngie ATF_CHECK_STREQ(getenv("crap0"), "0"); 75272343Sngie ATF_CHECK(getenv("crap1") == NULL); 76272343Sngie ATF_CHECK(getenv("crap2") == NULL); 77272343Sngie} 78272343Sngie 79272343SngieATF_TC(getenv_basic); 80272343SngieATF_TC_HEAD(getenv_basic, tc) 81272343Sngie{ 82272343Sngie atf_tc_set_md_var(tc, "descr", 83272343Sngie "Test setenv(3), getenv(3)"); 84272343Sngie} 85272343Sngie 86272343SngieATF_TC_BODY(getenv_basic, tc) 87272343Sngie{ 88272343Sngie ATF_CHECK(setenv("EVIL", "very=bad", 1) != -1); 89272343Sngie ATF_CHECK_STREQ(getenv("EVIL"), "very=bad"); 90272343Sngie ATF_CHECK(getenv("EVIL=very") == NULL); 91272343Sngie ATF_CHECK(unsetenv("EVIL") != -1); 92272343Sngie} 93272343Sngie 94272343SngieATF_TC(putenv_basic); 95272343SngieATF_TC_HEAD(putenv_basic, tc) 96272343Sngie{ 97272343Sngie atf_tc_set_md_var(tc, "descr", 98272343Sngie "Test putenv(3), getenv(3), unsetenv(3)"); 99272343Sngie} 100272343Sngie 101272343Sngie 102272343SngieATF_TC_BODY(putenv_basic, tc) 103272343Sngie{ 104272343Sngie char string[1024]; 105272343Sngie 106272343Sngie snprintf(string, sizeof(string), "crap=true"); 107272343Sngie ATF_CHECK(putenv(string) != -1); 108272343Sngie ATF_CHECK_STREQ(getenv("crap"), "true"); 109272343Sngie string[1] = 'l'; 110272343Sngie ATF_CHECK_STREQ(getenv("clap"), "true"); 111272343Sngie ATF_CHECK(getenv("crap") == NULL); 112272343Sngie string[1] = 'r'; 113272343Sngie ATF_CHECK(unsetenv("crap") != -1); 114272343Sngie ATF_CHECK(getenv("crap") == NULL); 115272343Sngie 116272343Sngie ATF_CHECK_ERRNO(EINVAL, putenv(NULL) == -1); 117272343Sngie ATF_CHECK_ERRNO(EINVAL, putenv(__UNCONST("val")) == -1); 118272343Sngie ATF_CHECK_ERRNO(EINVAL, putenv(__UNCONST("=val")) == -1); 119272343Sngie} 120272343Sngie 121272343SngieATF_TC(setenv_basic); 122272343SngieATF_TC_HEAD(setenv_basic, tc) 123272343Sngie{ 124272343Sngie atf_tc_set_md_var(tc, "descr", 125272343Sngie "Test setenv(3), getenv(3), unsetenv(3)"); 126309466Sngie atf_tc_set_md_var(tc, "timeout", "600"); 127272343Sngie} 128272343Sngie 129272343SngieATF_TC_BODY(setenv_basic, tc) 130272343Sngie{ 131272343Sngie const size_t numvars = 8192; 132272343Sngie size_t i, offset; 133272343Sngie char name[1024]; 134272343Sngie char value[1024]; 135272343Sngie 136272343Sngie offset = lrand48(); 137272343Sngie for (i = 0; i < numvars; i++) { 138272343Sngie (void)snprintf(name, sizeof(name), "var%zu", 139272343Sngie (i * 7 + offset) % numvars); 140272343Sngie (void)snprintf(value, sizeof(value), "value%ld", lrand48()); 141272343Sngie ATF_CHECK(setenv(name, value, 1) != -1); 142272343Sngie ATF_CHECK(setenv(name, "foo", 0) != -1); 143272343Sngie ATF_CHECK_STREQ(getenv(name), value); 144272343Sngie } 145272343Sngie 146272343Sngie offset = lrand48(); 147272343Sngie for (i = 0; i < numvars; i++) { 148272343Sngie (void)snprintf(name, sizeof(name), "var%zu", 149272343Sngie (i * 11 + offset) % numvars); 150272343Sngie ATF_CHECK(unsetenv(name) != -1); 151272343Sngie ATF_CHECK(getenv(name) == NULL); 152272343Sngie ATF_CHECK(unsetenv(name) != -1); 153272343Sngie } 154272343Sngie 155272343Sngie ATF_CHECK_ERRNO(EINVAL, setenv(NULL, "val", 1) == -1); 156272343Sngie ATF_CHECK_ERRNO(EINVAL, setenv("", "val", 1) == -1); 157272343Sngie ATF_CHECK_ERRNO(EINVAL, setenv("v=r", "val", 1) == -1); 158274626Sngie#ifdef __FreeBSD__ 159272891Sngie /* 160272891Sngie Both FreeBSD and OS/X does not validate the second 161272891Sngie argument to setenv(3) 162272891Sngie */ 163272891Sngie atf_tc_expect_signal(SIGSEGV, "FreeBSD does not validate the second " 164272891Sngie "argument to setenv(3); see bin/189805"); 165272891Sngie#endif 166272891Sngie 167272343Sngie ATF_CHECK_ERRNO(EINVAL, setenv("var", NULL, 1) == -1); 168272343Sngie 169272343Sngie ATF_CHECK(setenv("var", "=val", 1) == 0); 170272343Sngie ATF_CHECK_STREQ(getenv("var"), "=val"); 171272343Sngie} 172272343Sngie 173272343SngieATF_TC(setenv_mixed); 174272343SngieATF_TC_HEAD(setenv_mixed, tc) 175272343Sngie{ 176272343Sngie atf_tc_set_md_var(tc, "descr", 177272343Sngie "Test mixing setenv(3), unsetenv(3) and putenv(3)"); 178272343Sngie} 179272343Sngie 180272343SngieATF_TC_BODY(setenv_mixed, tc) 181272343Sngie{ 182272343Sngie char string[32]; 183272343Sngie 184272343Sngie (void)strcpy(string, "mixedcrap=putenv"); 185272343Sngie 186272343Sngie ATF_CHECK(setenv("mixedcrap", "setenv", 1) != -1); 187272343Sngie ATF_CHECK_STREQ(getenv("mixedcrap"), "setenv"); 188272343Sngie ATF_CHECK(putenv(string) != -1); 189272343Sngie ATF_CHECK_STREQ(getenv("mixedcrap"), "putenv"); 190272343Sngie ATF_CHECK(unsetenv("mixedcrap") != -1); 191272343Sngie ATF_CHECK(getenv("mixedcrap") == NULL); 192272343Sngie 193272343Sngie ATF_CHECK(putenv(string) != -1); 194272343Sngie ATF_CHECK_STREQ(getenv("mixedcrap"), "putenv"); 195272343Sngie ATF_CHECK(setenv("mixedcrap", "setenv", 1) != -1); 196272343Sngie ATF_CHECK_STREQ(getenv("mixedcrap"), "setenv"); 197272343Sngie ATF_CHECK(unsetenv("mixedcrap") != -1); 198272343Sngie ATF_CHECK(getenv("mixedcrap") == NULL); 199272343Sngie} 200272343Sngie 201272343SngieATF_TP_ADD_TCS(tp) 202272343Sngie{ 203272343Sngie 204272343Sngie ATF_TP_ADD_TC(tp, clearenv_basic); 205272343Sngie ATF_TP_ADD_TC(tp, getenv_basic); 206272343Sngie ATF_TP_ADD_TC(tp, putenv_basic); 207272343Sngie ATF_TP_ADD_TC(tp, setenv_basic); 208272343Sngie ATF_TP_ADD_TC(tp, setenv_mixed); 209272343Sngie 210272343Sngie return atf_no_error(); 211272343Sngie} 212