Many of these time conversion routines either don't copy back or don't
copy in when they should (for reads) or vice versa for writes. Correct
them.

Signed-off-by: Warner Losh <[email protected]>
---
 bsd-user/freebsd/os-time.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/bsd-user/freebsd/os-time.c b/bsd-user/freebsd/os-time.c
index 2dba352b2d..5b7c05ceb6 100644
--- a/bsd-user/freebsd/os-time.c
+++ b/bsd-user/freebsd/os-time.c
@@ -24,12 +24,12 @@ abi_long t2h_freebsd_timeval(struct timeval *tv, abi_ulong 
target_tv_addr)
 {
     struct target_freebsd_timeval *target_tv;
 
-    if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 0)) {
+    if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) {
         return -TARGET_EFAULT;
     }
     __get_user(tv->tv_sec, &target_tv->tv_sec);
     __get_user(tv->tv_usec, &target_tv->tv_usec);
-    unlock_user_struct(target_tv, target_tv_addr, 1);
+    unlock_user_struct(target_tv, target_tv_addr, 0);
 
     return 0;
 }
@@ -52,12 +52,12 @@ abi_long t2h_freebsd_timespec(struct timespec *ts, 
abi_ulong target_ts_addr)
 {
     struct target_freebsd_timespec *target_ts;
 
-    if (!lock_user_struct(VERIFY_READ, target_ts, target_ts_addr, 0)) {
+    if (!lock_user_struct(VERIFY_READ, target_ts, target_ts_addr, 1)) {
         return -TARGET_EFAULT;
     }
     __get_user(ts->tv_sec, &target_ts->tv_sec);
     __get_user(ts->tv_nsec, &target_ts->tv_nsec);
-    unlock_user_struct(target_ts, target_ts_addr, 1);
+    unlock_user_struct(target_ts, target_ts_addr, 0);
 
     return 0;
 }
@@ -91,7 +91,7 @@ abi_long t2h_freebsd_umtx_time(abi_ulong target_ut_addr,
         struct target_freebsd__umtx_time *target_ut;
         struct _umtx_time *ut = (struct _umtx_time *)host_t;
 
-        if (!lock_user_struct(VERIFY_READ, target_ut, target_ut_addr, 0)) {
+        if (!lock_user_struct(VERIFY_READ, target_ut, target_ut_addr, 1)) {
             return -TARGET_EFAULT;
         }
         if (t2h_freebsd_timespec(&ut->_timeout, h2g(&target_ut->_timeout))) {
@@ -99,7 +99,7 @@ abi_long t2h_freebsd_umtx_time(abi_ulong target_ut_addr,
         }
         __get_user(ut->_flags, &target_ut->_flags);
         __get_user(ut->_clockid, &target_ut->_clockid);
-        unlock_user_struct(target_ut, target_ut_addr, 1);
+        unlock_user_struct(target_ut, target_ut_addr, 0);
 
         if (target_ut_size > sizeof(struct target_freebsd__umtx_time)) {
             *host_tsz = sizeof(struct _umtx_time) + sizeof(struct timespec);
@@ -115,7 +115,7 @@ abi_long t2h_freebsd_timex(struct timex *host_tx, abi_ulong 
target_tx_addr)
 {
     struct target_freebsd_timex *target_tx;
 
-    if (!lock_user_struct(VERIFY_READ, target_tx, target_tx_addr, 0)) {
+    if (!lock_user_struct(VERIFY_READ, target_tx, target_tx_addr, 1)) {
         return -TARGET_EFAULT;
     }
     __get_user(host_tx->modes, &target_tx->modes);
@@ -134,7 +134,7 @@ abi_long t2h_freebsd_timex(struct timex *host_tx, abi_ulong 
target_tx_addr)
     __get_user(host_tx->calcnt, &target_tx->calcnt);
     __get_user(host_tx->errcnt, &target_tx->errcnt);
     __get_user(host_tx->stbcnt, &target_tx->stbcnt);
-    unlock_user_struct(target_tx, target_tx_addr, 1);
+    unlock_user_struct(target_tx, target_tx_addr, 0);
 
     return 0;
 }
@@ -274,7 +274,7 @@ abi_long target_to_host_itimerspec(struct itimerspec 
*host_itspec,
     host_itspec->it_value.tv_sec = tswapal(target_itspec->it_value.tv_sec);
     host_itspec->it_value.tv_nsec = tswapal(target_itspec->it_value.tv_nsec);
 
-    unlock_user_struct(target_itspec, target_addr, 1);
+    unlock_user_struct(target_itspec, target_addr, 0);
     return 0;
 }
 
@@ -293,7 +293,7 @@ abi_long host_to_target_itimerspec(abi_ulong target_addr,
     target_itspec->it_value.tv_sec = tswapal(host_its->it_value.tv_sec);
     target_itspec->it_value.tv_nsec = tswapal(host_its->it_value.tv_nsec);
 
-    unlock_user_struct(target_itspec, target_addr, 0);
+    unlock_user_struct(target_itspec, target_addr, 1);
     return 0;
 }
 

-- 
2.52.0


Reply via email to