aboutsummaryrefslogtreecommitdiff
path: root/website/static/security/patches/EN-25:16/vfs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'website/static/security/patches/EN-25:16/vfs.patch')
-rw-r--r--website/static/security/patches/EN-25:16/vfs.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/website/static/security/patches/EN-25:16/vfs.patch b/website/static/security/patches/EN-25:16/vfs.patch
new file mode 100644
index 0000000000..226ae9f81a
--- /dev/null
+++ b/website/static/security/patches/EN-25:16/vfs.patch
@@ -0,0 +1,52 @@
+--- sys/kern/vfs_syscalls.c.orig
++++ sys/kern/vfs_syscalls.c
+@@ -5050,11 +5050,12 @@
+ size_t retlen;
+ void *rl_rcookie, *rl_wcookie;
+ off_t inoff, outoff, savinoff, savoutoff;
+- bool foffsets_locked;
++ bool foffsets_locked, foffsets_set;
+
+ infp = outfp = NULL;
+ rl_rcookie = rl_wcookie = NULL;
+ foffsets_locked = false;
++ foffsets_set = false;
+ error = 0;
+ retlen = 0;
+
+@@ -5122,6 +5123,8 @@
+ }
+ foffset_lock_pair(infp1, &inoff, outfp1, &outoff, 0);
+ foffsets_locked = true;
++ } else {
++ foffsets_set = true;
+ }
+ savinoff = inoff;
+ savoutoff = outoff;
+@@ -5180,11 +5183,12 @@
+ vn_rangelock_unlock(invp, rl_rcookie);
+ if (rl_wcookie != NULL)
+ vn_rangelock_unlock(outvp, rl_wcookie);
++ if ((foffsets_locked || foffsets_set) &&
++ (error == EINTR || error == ERESTART)) {
++ inoff = savinoff;
++ outoff = savoutoff;
++ }
+ if (foffsets_locked) {
+- if (error == EINTR || error == ERESTART) {
+- inoff = savinoff;
+- outoff = savoutoff;
+- }
+ if (inoffp == NULL)
+ foffset_unlock(infp, inoff, 0);
+ else
+@@ -5193,6 +5197,9 @@
+ foffset_unlock(outfp, outoff, 0);
+ else
+ *outoffp = outoff;
++ } else if (foffsets_set) {
++ *inoffp = inoff;
++ *outoffp = outoff;
+ }
+ if (outfp != NULL)
+ fdrop(outfp, td);