From: Paul Floyd Date: Wed, 13 Mar 2024 20:34:08 +0000 (+0100) Subject: FreeBSD syscall: improve closefrom to make it similar to cloase_range X-Git-Tag: VALGRIND_3_23_0~115 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=196aafe601ff140b2e21e89e1be150f649f678da;p=thirdparty%2Fvalgrind.git FreeBSD syscall: improve closefrom to make it similar to cloase_range Was missing ML_(record_fd_close) calls for the fds. --- diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index 12b3d071d..bf4d7e581 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -5635,13 +5635,31 @@ PRE(sys_closefrom) * all of the host files like the log */ - for (int i = ARG1; i < VG_(fd_soft_limit); ++i) { - VG_(close)(i); + for (int fd = ARG1; fd < VG_(fd_hard_limit); ++fd) { + if ((fd != 2/*stderr*/ || VG_(debugLog_getLevel)() == 0) + && fd != VG_(log_output_sink).fd + && fd != VG_(xml_output_sink).fd) + VG_(close)(fd); } SET_STATUS_Success(0); } +POST(sys_closefrom) +{ + unsigned int fd; + unsigned int last = VG_(fd_hard_limit); + + if (!VG_(clo_track_fds)) + return; + + for (fd = ARG1; fd <= last; fd++) + if ((fd != 2/*stderr*/ || VG_(debugLog_getLevel)() == 0) + && fd != VG_(log_output_sink).fd + && fd != VG_(xml_output_sink).fd) + ML_(record_fd_close)(tid, fd); +} + // SYS___semctl 510 // int semctl(int semid, int semnum, int cmd, ...); // int __semctl(int semid, int semnum, int cmd, _Inout_ union semun *arg); @@ -7725,7 +7743,7 @@ const SyscallTableEntry ML_(syscall_table)[] = { BSDX_(__NR_jail_get, sys_jail_get), // 506 BSDX_(__NR_jail_set, sys_jail_set), // 507 BSDX_(__NR_jail_remove, sys_jail_remove), // 508 - BSDX_(__NR_closefrom, sys_closefrom), // 509 + BSDXY(__NR_closefrom, sys_closefrom), // 509 BSDXY(__NR___semctl, sys___semctl), // 510 BSDXY(__NR_msgctl, sys_msgctl), // 511 BSDXY(__NR_shmctl, sys_shmctl), // 512