Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/tests/gen/dlopen_empty_test.c
39500 views
1
/*-
2
* Copyright (c) 2016 Maksym Sobolyev
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#include <sys/stat.h>
28
#include <dlfcn.h>
29
#include <errno.h>
30
#include <fcntl.h>
31
#include <signal.h>
32
#include <stdio.h>
33
#include <stdlib.h>
34
#include <unistd.h>
35
36
#include <atf-c.h>
37
38
static const char *funname;
39
static char *soname;
40
41
static void
42
sigsegv_handler(int sig __unused)
43
{
44
unlink(soname);
45
free(soname);
46
atf_tc_fail("got SIGSEGV in the %s(3)", funname);
47
}
48
49
ATF_TC(dlopen_empty_test);
50
ATF_TC_HEAD(dlopen_empty_test, tc)
51
{
52
atf_tc_set_md_var(tc, "descr", "Tests the dlopen() of an empty file "
53
"returns an error");
54
}
55
ATF_TC_BODY(dlopen_empty_test, tc)
56
{
57
char tempname[] = "/tmp/temp.XXXXXX";
58
char *fname;
59
int fd;
60
void *dlh;
61
struct sigaction act, oact;
62
63
fname = mktemp(tempname);
64
ATF_REQUIRE_MSG(fname != NULL, "mktemp failed; errno=%d", errno);
65
asprintf(&soname, "%s.so", fname);
66
ATF_REQUIRE_MSG(soname != NULL, "asprintf failed; errno=%d", ENOMEM);
67
fd = open(soname, O_WRONLY | O_CREAT | O_TRUNC, DEFFILEMODE);
68
ATF_REQUIRE_MSG(fd != -1, "open(\"%s\") failed; errno=%d", soname, errno);
69
close(fd);
70
71
act.sa_handler = sigsegv_handler;
72
act.sa_flags = 0;
73
sigemptyset(&act.sa_mask);
74
ATF_CHECK_MSG(sigaction(SIGSEGV, &act, &oact) != -1,
75
"sigaction() failed");
76
77
funname = "dlopen";
78
dlh = dlopen(soname, RTLD_LAZY);
79
if (dlh != NULL) {
80
funname = "dlclose";
81
dlclose(dlh);
82
}
83
ATF_REQUIRE_MSG(dlh == NULL, "dlopen(\"%s\") did not fail", soname);
84
unlink(soname);
85
free(soname);
86
}
87
88
ATF_TP_ADD_TCS(tp)
89
{
90
91
ATF_TP_ADD_TC(tp, dlopen_empty_test);
92
93
return (atf_no_error());
94
}
95
96