** Description changed:
SRU Justification
Impact: Christian Kellner reported that creating temporary files via
O_TMPFILE shiftfs reports ESTALE. This can be reproduced via:
import tempfile
import os
-
def test():
- with tempfile.TemporaryFile() as fd:
- fd.write("data".encode('utf-8'))
- # re-open the file to get a read-only file descriptor
- return open(f"/proc/self/fd/{fd.fileno()}", "r")
-
+ with tempfile.TemporaryFile() as fd:
+ fd.write("data".encode('utf-8'))
+ # re-open the file to get a read-only file descriptor
+ return open(f"/proc/self/fd/{fd.fileno()}", "r")
def main():
- fd = test()
- fd.close()
-
+ fd = test()
+ fd.close()
if __name__ == "__main__":
- main()
+ main()
a similar issue was reported here:
https://github.com/systemd/systemd/issues/14861
+ Fix: Our revalidate methods were very opinionated about whether or not a
+ dentry was valid when we really should've just let the underlay tell us
+ what's what. This has led to bugs where a ESTALE was returned for e.g.
+ temporary files that were created and directly re-opened afterwards
+ through /proc/<pid>/fd/<nr-of-deleted-file>. When a file is re-opened
+ through /proc/<pid>/fd/<nr> LOOKUP_JUMP is set and the vfs will
+ revalidate via d_weak_revalidate(). Since the file has been unhashed or
+ even already gone negative we'd fail the open when we should've
+ succeeded.
+
+ I had also foolishly provided a .tmpfile method which so far only has
+ caused us trouble. If we really need this then we can reimplement it
+ properly but I doubt it. Remove it for now.
+
Regression Potential: Limited to shiftfs.
Test Case: Build a kernel with fix applied and run above reproducer.
--
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1872757
Title:
shiftfs: O_TMPFILE reports ESTALE
Status in linux package in Ubuntu:
In Progress
Bug description:
SRU Justification
Impact: Christian Kellner reported that creating temporary files via
O_TMPFILE shiftfs reports ESTALE. This can be reproduced via:
import tempfile
import os
def test():
with tempfile.TemporaryFile() as fd:
fd.write("data".encode('utf-8'))
# re-open the file to get a read-only file descriptor
return open(f"/proc/self/fd/{fd.fileno()}", "r")
def main():
fd = test()
fd.close()
if __name__ == "__main__":
main()
a similar issue was reported here:
https://github.com/systemd/systemd/issues/14861
Fix: Our revalidate methods were very opinionated about whether or not
a dentry was valid when we really should've just let the underlay tell
us what's what. This has led to bugs where a ESTALE was returned for
e.g. temporary files that were created and directly re-opened
afterwards through /proc/<pid>/fd/<nr-of-deleted-file>. When a file is
re-opened through /proc/<pid>/fd/<nr> LOOKUP_JUMP is set and the vfs
will revalidate via d_weak_revalidate(). Since the file has been
unhashed or even already gone negative we'd fail the open when we
should've succeeded.
I had also foolishly provided a .tmpfile method which so far only has
caused us trouble. If we really need this then we can reimplement it
properly but I doubt it. Remove it for now.
Regression Potential: Limited to shiftfs.
Test Case: Build a kernel with fix applied and run above reproducer.
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1872757/+subscriptions
--
Mailing list: https://launchpad.net/~kernel-packages
Post to : [email protected]
Unsubscribe : https://launchpad.net/~kernel-packages
More help : https://help.launchpad.net/ListHelp