On 2/1/22 22:14, Warner Losh wrote:
Releases the references to the iovec created by lock_iovec.
Signed-off-by: Warner Losh <i...@bsdimp.com>
---
bsd-user/freebsd/os-syscall.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index c21759ae7ce..d49945f0fcc 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -167,6 +167,29 @@ struct iovec *lock_iovec(int type, abi_ulong target_addr,
return NULL;
}
+void unlock_iovec(struct iovec *vec, abi_ulong target_addr,
+ int count, int copy)
+{
+ struct target_iovec *target_vec;
+ int i;
+
+ target_vec = lock_user(VERIFY_READ, target_addr,
+ count * sizeof(struct target_iovec), 1);
+ if (target_vec) {
+ for (i = 0; i < count; i++) {
+ abi_ulong base = tswapal(target_vec[i].iov_base);
+ abi_long len = tswapal(target_vec[i].iov_len);
+ if (len < 0) {
+ break;
+ }
+ unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0);
+ }
+ unlock_user(target_vec, target_addr, 0);
Not quite right. Any vec[i].iov_len == 0 ought to be skipped, as per the previous patch,
where we force those values for bad_address and target_vec[i].iov_len == 0.
r~