Commit 0b6cbc51 authored by Jakob Unterwurzacher's avatar Jakob Unterwurzacher

pollHack: handle GETATTR

When a filesystem is mounted with the default_permissions mount
option (which you want to do when other users can access the
mount), the kernel issues extra GETATTR calls to determine access
rights. The GETATTR was not handled and pollHack failed with
"numerical result out of range", preventing the mount from succeeding.

Handle GETATTR so mounting with default_permissions works again.

Before:

	$ gocryptfs -fusedebug -extpass "echo test" -ko default_permissions a b
	Reading password from extpass program "echo", arguments: ["test"]
	Decrypting master key
	2020/09/08 19:09:21 rx 2: INIT i0 {7.31 Ra 0x20000 ABORT_ERROR,MAX_PAGES,ATOMIC_O_TRUNC,EXPORT_SUPPORT,READDIRPLUS_AUTO,ASYNC_DIO,NO_OPEN_SUPPORT,PARALLEL_DIROPS,ASYNC_READ,BIG_WRITES,SPLICE_MOVE,WRITEBACK_CACHE,HANDLE_KILLPRIV,NO_OPENDIR_SUPPORT,CACHE_SYMLINKS,EXPLICIT_INVAL_DATA,POSIX_LOCKS,SPLICE_WRITE,SPLICE_READ,IOCTL_DIR,AUTO_INVAL_DATA,READDIRPLUS,DONT_MASK,FLOCK_LOCKS,POSIX_ACL}
	2020/09/08 19:09:21 tx 2:     OK, {7.28 Ra 0x20000 AUTO_INVAL_DATA,READDIRPLUS,NO_OPEN_SUPPORT,PARALLEL_DIROPS,ASYNC_READ,BIG_WRITES 0/0 Wr 0x20000 Tg 0x0}
	2020/09/08 19:09:21 rx 4: GETATTR i1 {Fh 0}
	2020/09/08 19:09:21 tx 4:     OK, {tA=1s {M040755 SZ=80 L=2 1026:1026 B0*4096 i0:1 A 1599584934.254242 M 1599584467.201817 C 1599584467.201817}}
	2020/09/08 19:09:21 rx 6: GETATTR i1 {Fh 0}
	2020/09/08 19:09:21 tx 6:     OK, {tA=1s {M040755 SZ=80 L=2 1026:1026 B0*4096 i0:1 A 1599584934.254242 M 1599584467.201817 C 1599584467.201817}}
	2020/09/08 19:09:21 rx 8: LOOKUP i1 [".go-fuse-epoll-hack"] 20b
	2020/09/08 19:09:21 tx 8:     OK, {i18446744073709551615 g0 tE=0s tA=0s {M0100644 SZ=0 L=1 0:0 B0*0 i0:18446744073709551615 A 0.000000 M 0.000000 C 0.000000}}
	2020/09/08 19:09:21 rx 10: LOOKUP i1 [".Trash"] 7b
	2020/09/08 19:09:21 tx 10:     2=no such file or directory, {i0 g0 tE=1s tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}}
	2020/09/08 19:09:21 rx 12: GETATTR i18446744073709551615 {Fh 0}
	2020/09/08 19:09:21 tx 12:     34=numerical result out of range, {tA=0s {M00 SZ=0 L=0 0:0 B0*0 i0:0 A 0.000000 M 0.000000 C 0.000000}}
	fs.Mount failed: numerical result out of range

After:

	$ gocryptfs -fusedebug -extpass "echo test" -ko default_permissions a b
	Reading password from extpass program "echo", arguments: ["test"]
	Decrypting master key
	2020/09/08 19:21:33 rx 2: INIT i0 {7.31 Ra 0x20000 READDIRPLUS,POSIX_ACL,CACHE_SYMLINKS,SPLICE_WRITE,IOCTL_DIR,AUTO_INVAL_DATA,FLOCK_LOCKS,ASYNC_DIO,HANDLE_KILLPRIV,ABORT_ERROR,ATOMIC_O_TRUNC,BIG_WRITES,DONT_MASK,SPLICE_MOVE,PARALLEL_DIROPS,EXPORT_SUPPORT,SPLICE_READ,READDIRPLUS_AUTO,WRITEBACK_CACHE,NO_OPEN_SUPPORT,ASYNC_READ,POSIX_LOCKS,MAX_PAGES,NO_OPENDIR_SUPPORT,EXPLICIT_INVAL_DATA}
	2020/09/08 19:21:33 tx 2:     OK, {7.28 Ra 0x20000 NO_OPEN_SUPPORT,ASYNC_READ,AUTO_INVAL_DATA,READDIRPLUS,BIG_WRITES,PARALLEL_DIROPS 0/0 Wr 0x20000 Tg 0x0}
	2020/09/08 19:21:33 rx 4: GETATTR i1 {Fh 0}
	2020/09/08 19:21:33 tx 4:     OK, {tA=1s {M040755 SZ=80 L=2 1026:1026 B0*4096 i0:1 A 1599585687.491337 M 1599585688.791343 C 1599585688.791343}}
	2020/09/08 19:21:33 rx 6: GETATTR i1 {Fh 0}
	2020/09/08 19:21:33 tx 6:     OK, {tA=1s {M040755 SZ=80 L=2 1026:1026 B0*4096 i0:1 A 1599585687.491337 M 1599585688.791343 C 1599585688.791343}}
	2020/09/08 19:21:33 rx 8: LOOKUP i1 [".go-fuse-epoll-hack"] 20b
	2020/09/08 19:21:33 tx 8:     OK, {i18446744073709551615 g0 tE=0s tA=0s {M0100644 SZ=0 L=1 0:0 B0*0 i0:18446744073709551615 A 0.000000 M 0.000000 C 0.000000}}
	2020/09/08 19:21:33 rx 10: GETATTR i18446744073709551615 {Fh 0}
	2020/09/08 19:21:33 tx 10:     OK, {tA=0s {M0100644 SZ=0 L=1 0:0 B0*0 i0:18446744073709551615 A 0.000000 M 0.000000 C 0.000000}}
	2020/09/08 19:21:33 rx 12: OPEN i18446744073709551615 {O_RDONLY,0x8000}
	2020/09/08 19:21:33 tx 12:     OK, {Fh 18446744073709551615 }
	2020/09/08 19:21:33 rx 14: POLL i18446744073709551615
	2020/09/08 19:21:33 tx 14:     38=function not implemented
	2020/09/08 19:21:33 rx 16: FLUSH i18446744073709551615 {Fh 18446744073709551615}
	2020/09/08 19:21:33 tx 16:     34=numerical result out of range
	2020/09/08 19:21:33 rx 18: RELEASE i18446744073709551615 {Fh 18446744073709551615 0x8000  L0}
	2020/09/08 19:21:33 tx 18:     34=numerical result out of range
	Filesystem mounted and ready.

Change-Id: Idfaea994ee6a4b8f28acbe8343063f6250cbef35
parent 9ca2d34b
...@@ -28,6 +28,10 @@ func doPollHackLookup(ms *Server, req *request) { ...@@ -28,6 +28,10 @@ func doPollHackLookup(ms *Server, req *request) {
Fh: pollHackInode, Fh: pollHackInode,
} }
req.status = OK req.status = OK
case _OP_GETATTR:
out := (*AttrOut)(req.outData())
out.Attr = attr
req.status = OK
case _OP_POLL: case _OP_POLL:
req.status = ENOSYS req.status = ENOSYS
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment