@@ -19,9 +19,16 @@ def setrlimit(self, resource, rlim):
1919from qiling import Qiling
2020
2121def __getrlimit_common (ql : Qiling , res : int , rlim : int ) -> int :
22- rlimit = resource .getrlimit (res )
23- ql .mem .write (rlim , ql .pack32s (rlimit [0 ]) + ql .pack32s (rlimit [1 ]))
24-
22+ RLIMIT_STACK = 3
23+ if res == RLIMIT_STACK :
24+ if ql .arch .bits == 64 :
25+ stack_size = int (ql .os .profile .get ("OS64" , "stack_size" ), 16 )
26+ elif ql .arch .bits == 32 :
27+ stack_size = int (ql .os .profile .get ("OS32" , "stack_size" ), 16 )
28+ rlimit = (stack_size , - 1 )
29+ else :
30+ rlimit = resource .getrlimit (res )
31+ ql .mem .write (rlim , ql .pack64s (rlimit [0 ]) + ql .pack64s (rlimit [1 ]))
2532 return 0
2633
2734def ql_syscall_ugetrlimit (ql : Qiling , res : int , rlim : int ):
@@ -30,23 +37,29 @@ def ql_syscall_ugetrlimit(ql: Qiling, res: int, rlim: int):
3037def ql_syscall_getrlimit (ql : Qiling , res : int , rlim : int ):
3138 return __getrlimit_common (ql , res , rlim )
3239
33- def ql_syscall_setrlimit (ql : Qiling , setrlimit_resource : int , setrlimit_rlim : int ):
40+ def ql_syscall_setrlimit (ql : Qiling , res : int , rlim : int ):
3441 # maybe we can nop the setrlimit
35- tmp_rlim = (ql .unpack32s (ql .mem .read (setrlimit_rlim , 4 )), ql .unpack32s (ql .mem .read (setrlimit_rlim + 4 , 4 )))
36- resource .setrlimit (setrlimit_resource , tmp_rlim )
42+ tmp_rlim = (ql .unpack32s (ql .mem .read (rlim , 4 )), ql .unpack32s (ql .mem .read (rlim + 4 , 4 )))
43+ resource .setrlimit (res , tmp_rlim )
3744
3845 return 0
3946
4047def ql_syscall_prlimit64 (ql : Qiling , pid : int , res : int , new_limit : int , old_limit : int ):
4148 # setrlimit() and getrlimit()
4249 if pid == 0 and new_limit == 0 :
43- rlim = resource .getrlimit (res )
44- ql .mem .write (old_limit , ql .packs (rlim [0 ]) + ql .packs (rlim [1 ]))
45-
46- return 0
50+ try :
51+ rlim = resource .getrlimit (res )
52+ ql .mem .write (old_limit , ql .packs (rlim [0 ]) + ql .packs (rlim [1 ]))
53+ return 0
54+ except :
55+ return - 1
4756
4857 # set other process which pid != 0
4958 return - 1
5059
51- def ql_syscall_getpriority (ql : Qiling , getpriority_which : int , getpriority_who : int ):
52- return os .getpriority (getpriority_which , getpriority_who )
60+ def ql_syscall_getpriority (ql : Qiling , which : int , who : int ):
61+ try :
62+ regreturn = os .getpriority (which , who )
63+ except :
64+ regreturn = - 1
65+ return regreturn
0 commit comments