/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- try_sbrk
- enforce_sbrk
- sbrk_bigpos
- sbrk_bigneg
- sbrk_neg
- sbrk_unalignedpos
- sbrk_unalignedneg
- test_sbrk
1 /*
2 * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009
3 * The President and Fellows of Harvard College.
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 * 3. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30 /*
31 * sbrk
32 */
33
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <string.h>
39 #include <unistd.h>
40 #include <errno.h>
41 #include <err.h>
42
43 #include "config.h"
44 #include "test.h"
45
46 static
47 int
48 try_sbrk(long val)
49 {
50 void *rv;
51 rv = sbrk(val);
52 if (rv==(void *)-1) {
53 return errno;
54 }
55 return 0;
56 }
57
58 static
59 void
60 enforce_sbrk(long val, const char *desc, int err)
61 {
62 int e;
63
64 e = try_sbrk(val);
65 if (e != err && e==0) {
66 warnx("FAILURE: sbrk(%s): no error", desc);
67 return;
68 }
69 if (e != err) {
70 errno = e;
71 warn("FAILURE: sbrk(%s): wrong error", desc);
72 return;
73 }
74 warnx("passed: sbrk(%s)", desc);
75 }
76
77 static
78 void
79 sbrk_bigpos(void)
80 {
81 enforce_sbrk(4096*1024*256, "huge positive", ENOMEM);
82 }
83
84 static
85 void
86 sbrk_bigneg(void)
87 {
88 enforce_sbrk(-4096*1024*256, "huge negative", EINVAL);
89 }
90
91 static
92 void
93 sbrk_neg(void)
94 {
95 enforce_sbrk(-8192, "too-large negative", EINVAL);
96 }
97
98 static
99 void
100 sbrk_unalignedpos(void)
101 {
102 switch (try_sbrk(17)) {
103 case 0:
104 case EINVAL:
105 warnx("passed: sbrk(unaligned positive)");
106 break;
107 default:
108 warn("FAILURE: sbrk(unaligned positive): wrong error");
109 break;
110 }
111 }
112
113 static
114 void
115 sbrk_unalignedneg(void)
116 {
117 switch (try_sbrk(-17)) {
118 case 0:
119 case EINVAL:
120 warnx("passed: sbrk(unaligned negative)");
121 break;
122 default:
123 warn("FAILURE: sbrk(unaligned negative): wrong error");
124 break;
125 }
126 }
127
128 void
129 test_sbrk(void)
130 {
131 sbrk_neg();
132 sbrk_bigpos();
133 sbrk_bigneg();
134 sbrk_unalignedpos();
135 sbrk_unalignedneg();
136 }
137