• 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 		TST_EXP_PASS_SILENT(brk((void *)new_brk), "brk()");
35 		if (!TST_PASS)
36 			return;
37 
38 		cur_brk = (uintptr_t)sbrk(0);
39 
40 		if (cur_brk != new_brk) {
41 			tst_res(TFAIL,
42 				"brk() failed to set address have %p expected %p",
43 				(void *)cur_brk, (void *)new_brk);
44 			return;
45 		}
46 
47 		/* Try to write to the newly allocated heap */
48 		if (i % 3 == 0)
49 			*((char *)cur_brk) = 0;
50 	}
51 
52 	tst_res(TPASS, "brk() works fine");
53 }
54 
55 static struct tst_test test = {
56 	.test_all = verify_brk,
57 };
58