@@ -1199,19 +1199,42 @@ pub extern "C" fn brk_syscall(
11991199 let cage = get_cage ( cageid) . unwrap ( ) ;
12001200
12011201 let mut vmmap = cage. vmmap . write ( ) ;
1202- let heap = vmmap. find_page ( HEAP_ENTRY_INDEX ) . unwrap ( ) . clone ( ) ;
1202+ let heap_opt = vmmap. find_page ( vmmap . heap_start ) ;
12031203
1204- assert ! ( heap. npages == vmmap. program_break) ;
1204+ let heap = if heap_opt. is_none ( ) {
1205+ // if heap page is not found, create an empty heap entry with 0 size
1206+ cage:: VmmapEntry :: new (
1207+ vmmap. heap_start ,
1208+ 0 ,
1209+ ( PROT_READ | PROT_WRITE ) ,
1210+ ( PROT_READ | PROT_WRITE ) ,
1211+ ( MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED ) as i32 ,
1212+ false ,
1213+ 0 ,
1214+ 0 ,
1215+ cageid,
1216+ MemoryBackingType :: Anonymous ,
1217+ )
1218+ } else {
1219+ heap_opt. unwrap ( ) . clone ( )
1220+ } ;
1221+
1222+ assert ! ( heap. page_num == vmmap. heap_start) ;
1223+
1224+ let old_brk_page = heap. page_num + heap. npages ;
12051225
12061226 // passing 0 to brk will always return the current brk
12071227 if brk == 0 {
1208- return ( PAGESIZE * heap . npages ) as i32 ;
1228+ return ( PAGESIZE * old_brk_page ) as i32 ;
12091229 }
1210-
1211- let old_brk_page = heap. npages ;
12121230 // round up the break to multiple of pages
12131231 let brk_page = ( round_up_page ( brk as u64 ) >> PAGESHIFT ) as u32 ;
12141232
1233+ // shrink heap below heap start is not allowed
1234+ if brk_page < vmmap. heap_start {
1235+ return syscall_error ( Errno :: ENOMEM , "brk" , "no memory" ) ;
1236+ }
1237+
12151238 // if we are incrementing program break, we need to check if we have enough space
12161239 if brk_page > old_brk_page {
12171240 if vmmap. check_existing_mapping ( old_brk_page, brk_page - old_brk_page, 0 ) {
@@ -1220,12 +1243,12 @@ pub extern "C" fn brk_syscall(
12201243 }
12211244
12221245 // remove the old entries since new entry is overlapping with it.
1223- vmmap. remove_entry ( 0 , old_brk_page ) ;
1246+ vmmap. remove_entry ( heap . page_num , heap . npages ) ;
12241247
12251248 // update vmmap entry
12261249 vmmap. add_entry_with_overwrite (
1227- 0 ,
1228- brk_page,
1250+ heap . page_num ,
1251+ brk_page - heap . page_num ,
12291252 heap. prot ,
12301253 heap. maxprot ,
12311254 heap. flags ,
@@ -1241,8 +1264,6 @@ pub extern "C" fn brk_syscall(
12411264 let new_heap_end_usr = ( brk_page * PAGESIZE ) as u32 ;
12421265 let new_heap_end_sys = vmmap. user_to_sys ( new_heap_end_usr) as * mut u8 ;
12431266
1244- vmmap. set_program_break ( brk_page) ;
1245-
12461267 drop ( vmmap) ;
12471268
12481269 // if new brk is larger than old brk
0 commit comments