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)13void 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