Skip to content

Commit 22178cb

Browse files
committed
libc: tests: fix the gethostname() and getdomainname() tests
Instead of relying on any particular domainname and hostname to succeed, spin up a jail before we execute the test with them set to some known, fixed values. This allows them to be meaningfully tested -- previously, they were skipped much more often than not. Reported by: jlduran Reviewed by: jlduran, markj Differential Revision: https://reviews.freebsd.org/D49237
1 parent 09cdbf0 commit 22178cb

12 files changed

+109
-92
lines changed

lib/libc/tests/secure/fortify_poll_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_random_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_select_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_socket_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_stdio_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_stdlib_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_string_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_strings_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_uio_test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>

lib/libc/tests/secure/fortify_unistd_test.c

Lines changed: 62 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#define TMPFILE_SIZE (1024 * 32)
55

66
#include <sys/param.h>
7+
#include <sys/jail.h>
78
#include <sys/random.h>
89
#include <sys/resource.h>
910
#include <sys/select.h>
@@ -162,6 +163,27 @@ replace_stdin(void)
162163
close(fd);
163164
}
164165

166+
#define JAIL_HOSTNAME "host.example.com"
167+
#define JAIL_DOMAINNAME "example.com"
168+
static void
169+
dhost_jail(void)
170+
{
171+
struct iovec iov[4];
172+
int jid;
173+
174+
iov[0].iov_base = __DECONST(char *, "host.hostname");
175+
iov[0].iov_len = sizeof("host.hostname");
176+
iov[1].iov_base = __DECONST(char *, JAIL_HOSTNAME);
177+
iov[1].iov_len = sizeof(JAIL_HOSTNAME);
178+
iov[2].iov_base = __DECONST(char *, "host.domainname");
179+
iov[2].iov_len = sizeof("host.domainname");
180+
iov[3].iov_base = __DECONST(char *, JAIL_DOMAINNAME);
181+
iov[3].iov_len = sizeof(JAIL_DOMAINNAME);
182+
183+
jid = jail_set(iov, nitems(iov), JAIL_CREATE | JAIL_ATTACH);
184+
ATF_REQUIRE_MSG(jid > 0, "Jail creation failed: %s", strerror(errno));
185+
}
186+
165187
ATF_TC(getcwd_before_end);
166188
ATF_TC_HEAD(getcwd_before_end, tc)
167189
{
@@ -1354,24 +1376,21 @@ ATF_TC_BODY(readlinkat_heap_after_end, tc)
13541376
ATF_TC(getdomainname_before_end);
13551377
ATF_TC_HEAD(getdomainname_before_end, tc)
13561378
{
1379+
atf_tc_set_md_var(tc, "require.user", "root");
13571380
}
13581381
ATF_TC_BODY(getdomainname_before_end, tc)
13591382
{
13601383
#define BUF &__stack.__buf
13611384
struct {
13621385
uint8_t padding_l;
1363-
unsigned char __buf[4];
1386+
unsigned char __buf[12];
13641387
uint8_t padding_r;
13651388
} __stack;
13661389
const size_t __bufsz __unused = sizeof(__stack.__buf);
1367-
const size_t __len = 4 - 1;
1390+
const size_t __len = 12 - 1;
13681391
const size_t __idx __unused = __len - 1;
1369-
char sysdomain[256];
1370-
1371-
(void)getdomainname(sysdomain, __len);
1372-
if (strlen(sysdomain) <= __len)
1373-
atf_tc_skip("domain name too short for testing");
13741392

1393+
dhost_jail();
13751394
getdomainname(__stack.__buf, __len);
13761395
#undef BUF
13771396

@@ -1380,24 +1399,21 @@ ATF_TC_BODY(getdomainname_before_end, tc)
13801399
ATF_TC(getdomainname_end);
13811400
ATF_TC_HEAD(getdomainname_end, tc)
13821401
{
1402+
atf_tc_set_md_var(tc, "require.user", "root");
13831403
}
13841404
ATF_TC_BODY(getdomainname_end, tc)
13851405
{
13861406
#define BUF &__stack.__buf
13871407
struct {
13881408
uint8_t padding_l;
1389-
unsigned char __buf[4];
1409+
unsigned char __buf[12];
13901410
uint8_t padding_r;
13911411
} __stack;
13921412
const size_t __bufsz __unused = sizeof(__stack.__buf);
1393-
const size_t __len = 4;
1413+
const size_t __len = 12;
13941414
const size_t __idx __unused = __len - 1;
1395-
char sysdomain[256];
1396-
1397-
(void)getdomainname(sysdomain, __len);
1398-
if (strlen(sysdomain) <= __len)
1399-
atf_tc_skip("domain name too short for testing");
14001415

1416+
dhost_jail();
14011417
getdomainname(__stack.__buf, __len);
14021418
#undef BUF
14031419

@@ -1406,6 +1422,7 @@ ATF_TC_BODY(getdomainname_end, tc)
14061422
ATF_TC(getdomainname_heap_before_end);
14071423
ATF_TC_HEAD(getdomainname_heap_before_end, tc)
14081424
{
1425+
atf_tc_set_md_var(tc, "require.user", "root");
14091426
}
14101427
ATF_TC_BODY(getdomainname_heap_before_end, tc)
14111428
{
@@ -1415,15 +1432,11 @@ ATF_TC_BODY(getdomainname_heap_before_end, tc)
14151432
unsigned char * __buf;
14161433
uint8_t padding_r;
14171434
} __stack;
1418-
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
1419-
const size_t __len = 4 - 1;
1435+
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (12);
1436+
const size_t __len = 12 - 1;
14201437
const size_t __idx __unused = __len - 1;
1421-
char sysdomain[256];
1422-
1423-
(void)getdomainname(sysdomain, __len);
1424-
if (strlen(sysdomain) <= __len)
1425-
atf_tc_skip("domain name too short for testing");
14261438

1439+
dhost_jail();
14271440
__stack.__buf = malloc(__bufsz);
14281441

14291442
getdomainname(__stack.__buf, __len);
@@ -1434,6 +1447,7 @@ ATF_TC_BODY(getdomainname_heap_before_end, tc)
14341447
ATF_TC(getdomainname_heap_end);
14351448
ATF_TC_HEAD(getdomainname_heap_end, tc)
14361449
{
1450+
atf_tc_set_md_var(tc, "require.user", "root");
14371451
}
14381452
ATF_TC_BODY(getdomainname_heap_end, tc)
14391453
{
@@ -1443,15 +1457,11 @@ ATF_TC_BODY(getdomainname_heap_end, tc)
14431457
unsigned char * __buf;
14441458
uint8_t padding_r;
14451459
} __stack;
1446-
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
1447-
const size_t __len = 4;
1460+
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (12);
1461+
const size_t __len = 12;
14481462
const size_t __idx __unused = __len - 1;
1449-
char sysdomain[256];
1450-
1451-
(void)getdomainname(sysdomain, __len);
1452-
if (strlen(sysdomain) <= __len)
1453-
atf_tc_skip("domain name too short for testing");
14541463

1464+
dhost_jail();
14551465
__stack.__buf = malloc(__bufsz);
14561466

14571467
getdomainname(__stack.__buf, __len);
@@ -1462,6 +1472,7 @@ ATF_TC_BODY(getdomainname_heap_end, tc)
14621472
ATF_TC(getdomainname_heap_after_end);
14631473
ATF_TC_HEAD(getdomainname_heap_after_end, tc)
14641474
{
1475+
atf_tc_set_md_var(tc, "require.user", "root");
14651476
}
14661477
ATF_TC_BODY(getdomainname_heap_after_end, tc)
14671478
{
@@ -1471,17 +1482,13 @@ ATF_TC_BODY(getdomainname_heap_after_end, tc)
14711482
unsigned char * __buf;
14721483
uint8_t padding_r;
14731484
} __stack;
1474-
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
1475-
const size_t __len = 4 + 1;
1485+
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (12);
1486+
const size_t __len = 12 + 1;
14761487
const size_t __idx __unused = __len - 1;
14771488
pid_t __child;
14781489
int __status;
1479-
char sysdomain[256];
1480-
1481-
(void)getdomainname(sysdomain, __len);
1482-
if (strlen(sysdomain) <= __len)
1483-
atf_tc_skip("domain name too short for testing");
14841490

1491+
dhost_jail();
14851492
__child = fork();
14861493
ATF_REQUIRE(__child >= 0);
14871494
if (__child > 0)
@@ -1663,25 +1670,21 @@ ATF_TC_BODY(getentropy_heap_after_end, tc)
16631670
ATF_TC(gethostname_before_end);
16641671
ATF_TC_HEAD(gethostname_before_end, tc)
16651672
{
1673+
atf_tc_set_md_var(tc, "require.user", "root");
16661674
}
16671675
ATF_TC_BODY(gethostname_before_end, tc)
16681676
{
16691677
#define BUF &__stack.__buf
16701678
struct {
16711679
uint8_t padding_l;
1672-
unsigned char __buf[4];
1680+
unsigned char __buf[17];
16731681
uint8_t padding_r;
16741682
} __stack;
16751683
const size_t __bufsz __unused = sizeof(__stack.__buf);
1676-
const size_t __len = 4 - 1;
1684+
const size_t __len = 17 - 1;
16771685
const size_t __idx __unused = __len - 1;
1678-
char syshost[256];
1679-
int error;
1680-
1681-
error = gethostname(syshost, __len);
1682-
if (error != 0 || strlen(syshost) <= __len)
1683-
atf_tc_skip("hostname too short for testing");
16841686

1687+
dhost_jail();
16851688
gethostname(__stack.__buf, __len);
16861689
#undef BUF
16871690

@@ -1690,25 +1693,21 @@ ATF_TC_BODY(gethostname_before_end, tc)
16901693
ATF_TC(gethostname_end);
16911694
ATF_TC_HEAD(gethostname_end, tc)
16921695
{
1696+
atf_tc_set_md_var(tc, "require.user", "root");
16931697
}
16941698
ATF_TC_BODY(gethostname_end, tc)
16951699
{
16961700
#define BUF &__stack.__buf
16971701
struct {
16981702
uint8_t padding_l;
1699-
unsigned char __buf[4];
1703+
unsigned char __buf[17];
17001704
uint8_t padding_r;
17011705
} __stack;
17021706
const size_t __bufsz __unused = sizeof(__stack.__buf);
1703-
const size_t __len = 4;
1707+
const size_t __len = 17;
17041708
const size_t __idx __unused = __len - 1;
1705-
char syshost[256];
1706-
int error;
1707-
1708-
error = gethostname(syshost, __len);
1709-
if (error != 0 || strlen(syshost) <= __len)
1710-
atf_tc_skip("hostname too short for testing");
17111709

1710+
dhost_jail();
17121711
gethostname(__stack.__buf, __len);
17131712
#undef BUF
17141713

@@ -1717,6 +1716,7 @@ ATF_TC_BODY(gethostname_end, tc)
17171716
ATF_TC(gethostname_heap_before_end);
17181717
ATF_TC_HEAD(gethostname_heap_before_end, tc)
17191718
{
1719+
atf_tc_set_md_var(tc, "require.user", "root");
17201720
}
17211721
ATF_TC_BODY(gethostname_heap_before_end, tc)
17221722
{
@@ -1726,16 +1726,11 @@ ATF_TC_BODY(gethostname_heap_before_end, tc)
17261726
unsigned char * __buf;
17271727
uint8_t padding_r;
17281728
} __stack;
1729-
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
1730-
const size_t __len = 4 - 1;
1729+
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (17);
1730+
const size_t __len = 17 - 1;
17311731
const size_t __idx __unused = __len - 1;
1732-
char syshost[256];
1733-
int error;
1734-
1735-
error = gethostname(syshost, __len);
1736-
if (error != 0 || strlen(syshost) <= __len)
1737-
atf_tc_skip("hostname too short for testing");
17381732

1733+
dhost_jail();
17391734
__stack.__buf = malloc(__bufsz);
17401735

17411736
gethostname(__stack.__buf, __len);
@@ -1746,6 +1741,7 @@ ATF_TC_BODY(gethostname_heap_before_end, tc)
17461741
ATF_TC(gethostname_heap_end);
17471742
ATF_TC_HEAD(gethostname_heap_end, tc)
17481743
{
1744+
atf_tc_set_md_var(tc, "require.user", "root");
17491745
}
17501746
ATF_TC_BODY(gethostname_heap_end, tc)
17511747
{
@@ -1755,16 +1751,11 @@ ATF_TC_BODY(gethostname_heap_end, tc)
17551751
unsigned char * __buf;
17561752
uint8_t padding_r;
17571753
} __stack;
1758-
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
1759-
const size_t __len = 4;
1754+
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (17);
1755+
const size_t __len = 17;
17601756
const size_t __idx __unused = __len - 1;
1761-
char syshost[256];
1762-
int error;
1763-
1764-
error = gethostname(syshost, __len);
1765-
if (error != 0 || strlen(syshost) <= __len)
1766-
atf_tc_skip("hostname too short for testing");
17671757

1758+
dhost_jail();
17681759
__stack.__buf = malloc(__bufsz);
17691760

17701761
gethostname(__stack.__buf, __len);
@@ -1775,6 +1766,7 @@ ATF_TC_BODY(gethostname_heap_end, tc)
17751766
ATF_TC(gethostname_heap_after_end);
17761767
ATF_TC_HEAD(gethostname_heap_after_end, tc)
17771768
{
1769+
atf_tc_set_md_var(tc, "require.user", "root");
17781770
}
17791771
ATF_TC_BODY(gethostname_heap_after_end, tc)
17801772
{
@@ -1784,18 +1776,13 @@ ATF_TC_BODY(gethostname_heap_after_end, tc)
17841776
unsigned char * __buf;
17851777
uint8_t padding_r;
17861778
} __stack;
1787-
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (4);
1788-
const size_t __len = 4 + 1;
1779+
const size_t __bufsz __unused = sizeof(*__stack.__buf) * (17);
1780+
const size_t __len = 17 + 1;
17891781
const size_t __idx __unused = __len - 1;
17901782
pid_t __child;
17911783
int __status;
1792-
char syshost[256];
1793-
int error;
1794-
1795-
error = gethostname(syshost, __len);
1796-
if (error != 0 || strlen(syshost) <= __len)
1797-
atf_tc_skip("hostname too short for testing");
17981784

1785+
dhost_jail();
17991786
__child = fork();
18001787
ATF_REQUIRE(__child >= 0);
18011788
if (__child > 0)

0 commit comments

Comments
 (0)