1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2016 Joyent, Inc.
14  */
15 
16 /*
17  * Basic tests for aligned_alloc(3C). Note that we test ENOMEM failure by
18  * relying on the implementation of the current libc malloc. Specifically we go
19  * through and add a mapping so we can't expand the heap and then use it up. If
20  * the memory allocator is ever changed, this test will start failing, at which
21  * point, it may not be worth the cost of keeping it around.
22  */
23 
24 #include <stdlib.h>
25 #include <errno.h>
26 #include <libproc.h>
27 #include <sys/sysmacros.h>
28 #include <sys/mman.h>
29 #include <sys/debug.h>
30 
31 int
main(void)32 main(void)
33 {
34 	pstatus_t status;
35 	void *buf;
36 
37 	/*
38 	 * Alignment must be sizeof (void *) (word) aligned.
39 	 */
40 	VERIFY3P(aligned_alloc(sizeof (void *) - 1, 16), ==, NULL);
41 	VERIFY3S(errno, ==, EINVAL);
42 
43 	VERIFY3P(aligned_alloc(sizeof (void *) + 1, 16), ==, NULL);
44 	VERIFY3S(errno, ==, EINVAL);
45 
46 
47 	VERIFY3P(aligned_alloc(23, 16), ==, NULL);
48 	VERIFY3S(errno, ==, EINVAL);
49 
50 	buf = aligned_alloc(sizeof (void *), 16);
51 	VERIFY3P(buf, !=, NULL);
52 	free(buf);
53 
54 	/*
55 	 * Cause ENOMEM
56 	 */
57 	VERIFY0(proc_get_status(getpid(), &status));
58 	VERIFY3P(mmap((caddr_t)P2ROUNDUP(status.pr_brkbase +
59 	    status.pr_brksize, 0x1000), 0x1000,
60 	    PROT_READ, MAP_ANON | MAP_FIXED | MAP_PRIVATE, -1, 0),
61 	    !=, (void *)-1);
62 
63 	for (;;) {
64 		if (malloc(16) == NULL)
65 			break;
66 	}
67 
68 	for (;;) {
69 		if (aligned_alloc(sizeof (void *), 16) == NULL)
70 			break;
71 	}
72 
73 	VERIFY3P(aligned_alloc(sizeof (void *), 16), ==, NULL);
74 	VERIFY3S(errno, ==, ENOMEM);
75 
76 	return (0);
77 }
78