diff options
Diffstat (limited to 'website/static/security/patches/EN-25:16/vfs.patch')
-rw-r--r-- | website/static/security/patches/EN-25:16/vfs.patch | 52 |
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); |