diff options
Diffstat (limited to 'usr/src/test/libc-tests')
| -rw-r--r-- | usr/src/test/libc-tests/runfiles/default.run | 2 | ||||
| -rw-r--r-- | usr/src/test/libc-tests/tests/Makefile | 1 | ||||
| -rw-r--r-- | usr/src/test/libc-tests/tests/env-7076.c | 73 | 
3 files changed, 76 insertions, 0 deletions
| diff --git a/usr/src/test/libc-tests/runfiles/default.run b/usr/src/test/libc-tests/runfiles/default.run index 801558459a..864001eb46 100644 --- a/usr/src/test/libc-tests/runfiles/default.run +++ b/usr/src/test/libc-tests/runfiles/default.run @@ -62,6 +62,8 @@ outputdir = /var/tmp/test_results  [/opt/libc-tests/tests/catopen]  [/opt/libc-tests/tests/env-OS-4089.32]  [/opt/libc-tests/tests/env-OS-4089.64] +[/opt/libc-tests/tests/env-7076.32] +[/opt/libc-tests/tests/env-7076.64]  [/opt/libc-tests/tests/endian.32]  [/opt/libc-tests/tests/endian.64]  [/opt/libc-tests/tests/quick_exit] diff --git a/usr/src/test/libc-tests/tests/Makefile b/usr/src/test/libc-tests/tests/Makefile index 34c0123d88..68f6df3b2d 100644 --- a/usr/src/test/libc-tests/tests/Makefile +++ b/usr/src/test/libc-tests/tests/Makefile @@ -35,6 +35,7 @@ PROGS = \  	c11_tss \  	call_once \  	endian \ +	env-7076 \  	quick_exit_order \  	quick_exit_status \  	timespec_get diff --git a/usr/src/test/libc-tests/tests/env-7076.c b/usr/src/test/libc-tests/tests/env-7076.c new file mode 100644 index 0000000000..6349747bd8 --- /dev/null +++ b/usr/src/test/libc-tests/tests/env-7076.c @@ -0,0 +1,73 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source.  A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright 2016 Joyent, Inc. + */ + +/* + * Regression test for 7076 where doing a putenv() call without an '=' sign + * may lead to a segmentation fault when doing a getenv() depending on the + * circumstances of the environment's layout. Verify putenv() mimics + * unsetenv(). + */ + +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <sys/debug.h> + +int +main(void) +{ +	if (putenv("FOO=bar") != 0) { +		fprintf(stderr, "failed to put FOO into the environment: %s\n", +		    strerror(errno)); +		return (1); +	} + +	if (getenv("FOO") == NULL) { +		fprintf(stderr, "failed to retrieve FOO from the " +		    "environment!\n"); +		return (1); +	} + +	VERIFY0(unsetenv("FOO")); + +	if (getenv("FOO") != NULL) { +		fprintf(stderr, "Somehow retrieved FOO from the " +		    "environment after unsetenv()!\n"); +		return (1); +	} + +	if (putenv("FOO=bar") != 0) { +		fprintf(stderr, "failed to put FOO into the environment: %s\n", +		    strerror(errno)); +		return (1); +	} + +	if (getenv("FOO") == NULL) { +		fprintf(stderr, "failed to retrieve FOO from the " +		    "environment!\n"); +		return (1); +	} + +	VERIFY0(putenv("FOO")); + +	if (getenv("FOO") != NULL) { +		fprintf(stderr, "Somehow retrieved FOO from the " +		    "environment after putenv()!\n"); +		return (1); +	} + +	return (0); +} | 
