• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) 2017 Cyril Hrubis <chrubis@suse.cz>
4  */
5 
6 #include <unistd.h>
7 #include <stdint.h>
8 #include <inttypes.h>
9 #include <errno.h>
10 
11 #include "tst_test.h"
12 
verify_brk(void)13 void verify_brk(void)
14 {
15 	uintptr_t cur_brk, new_brk;
16 	uintptr_t inc = getpagesize() * 2 - 1;
17 	unsigned int i;
18 
19 	cur_brk = (uintptr_t)sbrk(0);
20 
21 	for (i = 0; i < 33; i++) {
22 		switch (i % 3) {
23 		case 0:
24 			new_brk = cur_brk + inc;
25 		break;
26 		case 1:
27 			new_brk = cur_brk;
28 		break;
29 		case 2:
30 			new_brk = cur_brk - inc;
31 		break;
32 		}
33 
34 		TEST(brk((void *)new_brk));
35 
36 		if (TST_RET == -1) {
37 			tst_res(TFAIL | TERRNO, "brk() failed");
38 			return;
39 		}
40 
41 		cur_brk = (uintptr_t)sbrk(0);
42 
43 		if (cur_brk != new_brk) {
44 			tst_res(TFAIL,
45 				"brk() failed to set address have %p expected %p",
46 				(void *)cur_brk, (void *)new_brk);
47 			return;
48 		}
49 
50 		/* Try to write to the newly allocated heap */
51 		if (i % 3 == 0)
52 			*((char *)cur_brk) = 0;
53 	}
54 
55 	tst_res(TPASS, "brk() works fine");
56 }
57 
58 static struct tst_test test = {
59 	.test_all = verify_brk,
60 };
61