Sebastian Lackner
2332462e78
fusefrontend: Filter O_CREAT in mangleOpenFlags.
2019-01-07 21:19:13 +01:00
Sebastian Lackner
aa2fa24c42
fusefrontend: Check result of Fchmod syscall.
...
Fixes https://github.com/rfjakob/gocryptfs/issues/328
2019-01-06 21:00:17 +01:00
Sebastian Lackner
40d2427fd7
fusefrontend: Fix computation of cipherSz in Allocate FUSE call.
...
Do not use PlainSizeToCipherSize() since this adds the 18 bytes file header.
Partially fixes https://github.com/rfjakob/gocryptfs/issues/311
2019-01-06 20:56:59 +01:00
Sebastian Lackner
8310dd95be
fusefrontend: Properly convert plaintext <-> ciphertext offsets in SeekData().
...
Fixes https://github.com/rfjakob/gocryptfs/issues/304
2019-01-06 12:21:54 +01:00
Sebastian Lackner
7e05e809b7
main: Run 'ensure fds' code early during the program startup.
...
The files are apparently processed in alphabetic order, so cli_args.go is
processed before main.go. In order to run before the go-fuse imports, put
the 'ensure fds' code in a separate package. Debug messages are omitted
to avoid additional imports (that might contain other code messing up our
file descriptors).
2019-01-05 16:12:16 +01:00
Sebastian Lackner
5055f39bd5
fusefrontend: Allow to set/remove xattr on directory without read permission.
...
Setting/removing extended attributes on directories was partially fixed with
commit eff35e60b6
. However, on most file systems
it is also possible to do these operations without read access (see tests).
Since we cannot open a write-access fd to a directory, we have to use the
/proc/self/fd trick (already used for ListXAttr) for the other operations aswell.
For simplicity, let's separate the Linux and Darwin code again (basically revert
commit f320b76fd1
), and always use the
/proc/self/fd trick on Linux. On Darwin we use the best-effort approach with
openBackingFile() as a fallback.
More discussion about the available options is available in
https://github.com/rfjakob/gocryptfs/issues/308 .
2019-01-05 12:34:40 +01:00
Sebastian Lackner
f17721c364
A few more spelling fixes.
2019-01-05 12:27:55 +01:00
Jakob Unterwurzacher
65eded4a22
tests: bump maxCacheFds to 3
...
As the dirCache now has 3 entries, the tests should accept
up to 3 extra fds without declaring an fd leak.
2019-01-04 23:50:01 +01:00
Jakob Unterwurzacher
c32066c5b0
fusefrontend: fix fd leak in dirCache
...
The missing break meant that we may find a second
hit in the cache, Dup() a second fd, and leak the first
one.
Thanks @slackner for finding this.
2019-01-04 23:35:48 +01:00
Jakob Unterwurzacher
3473a84963
fusefrontend: print warning when Create() runs out of file descriptors
...
We alread have this warning in Open(), but xfstests generic/488
causes "too many open files" via Create. Add the same message so
the user sees what is going on.
2019-01-04 23:15:04 +01:00
Jakob Unterwurzacher
eff35e60b6
fusefrontend: fix setting xattrs on directories
...
Directories cannot be opened read-write. Retry with RDONLY.
2019-01-04 22:22:24 +01:00
Jakob Unterwurzacher
3365cfc02b
fusefrontend: disable dirCache stats printing
...
This was inadvertedly kept enabled after benchmarking.
2019-01-04 22:07:02 +01:00
Jakob Unterwurzacher
c0a7a14cde
fusefrontend: upgrade to three-entry dirCache
...
3 entries should work well for up to three parallel users.
It works well for extractloop.bash (two parallel tar extracts).
2019-01-04 21:45:03 +01:00
Sebastian Lackner
acf7e52022
fusefrontend: Allow to create sparse file of size 4096.
...
When the old size is zero, there are no existing blocks to merge the
new data with. Directly use Ftruncate if the size is block-aligned.
Fixes https://github.com/rfjakob/gocryptfs/issues/305
2019-01-04 01:38:47 +01:00
Sebastian Lackner
ab169443fd
A few more spelling fixes.
...
Found with the 'codespell' utility.
2019-01-04 01:23:44 +01:00
Sebastian Lackner
a1ba4b6576
Omit syscall.O_RDONLY flag when passing O_PATH.
...
When O_PATH is specified in flags, flag bits other than O_CLOEXEC, O_DIRECTORY,
and O_NOFOLLOW are ignored.
2019-01-03 18:24:05 +01:00
Sebastian Lackner
0414ef2572
fusefrontend: Use appropriate flags in decryptPathAt.
2019-01-03 18:24:05 +01:00
Sebastian Lackner
c0640ff3ef
fusefrontend: Open directory with syscall.O_DIRECTORY in OpenDir.
2019-01-03 18:24:05 +01:00
Sebastian Lackner
078a431493
fusefrontend: Open directory with syscall.O_DIRECTORY in Rmdir.
2019-01-03 18:24:05 +01:00
Sebastian Lackner
885a341df6
fusefrontend: Do not Clear cache at end of Rmdir function.
...
We already do 'defer fs.dirCache.Clear()', so this is no longer required.
2019-01-03 18:24:05 +01:00
Sebastian Lackner
d86f9914ac
fusefrontend: Remove debug code.
...
This code was accidentially added in 4f66d66755
.
2019-01-03 18:24:05 +01:00
Jakob Unterwurzacher
fcdb4bec09
fusefronted: dirCache: fix bug handling ""
...
Bug looked like this:
$ ls -l .
total 0
drwxrwxr-x. 2 jakob jakob 60 Jan 3 15:42 foo
-rw-rw-r--. 1 jakob jakob 0 Jan 3 15:46 x
$ ls -l .
ls: cannot access '.': No such file or directory
(only happened when "" was in the dirCache)
2019-01-03 15:59:54 +01:00
Jakob Unterwurzacher
4f66d66755
fusefrontend: add dirCache
2019-01-03 15:31:13 +01:00
Jakob Unterwurzacher
f6dad8d0fa
nametransform: simplify WriteDirIV to WriteDirIVAt
...
Un-spaghettify the function and let the callers open
the directory.
2019-01-03 15:31:13 +01:00
Jakob Unterwurzacher
0fd7637624
fusefrontend: use O_RDONLY in the ListXAttr fallback path
...
Copy-paste error.
https://github.com/rfjakob/gocryptfs/issues/308
2019-01-02 22:20:44 +01:00
Jakob Unterwurzacher
352f3147c5
fusefrontend: move openBackingDir into its own file
...
This function is in all fastpaths, will get a cache, and needs
its own file.
renamed: internal/fusefrontend/names.go -> internal/fusefrontend/openbackingdir.go
renamed: internal/fusefrontend/names_test.go -> internal/fusefrontend/openbackingdir_test.go
2019-01-02 21:52:52 +01:00
Jakob Unterwurzacher
2b12bba274
fusefronted: make EncryptPath symlink-safe
...
Finally allows us to delete EncryptPathDirIV.
2019-01-02 21:45:40 +01:00
Jakob Unterwurzacher
b214be5e3f
fusefrontend: xattr: fix operations on files without read permissions
...
* listxattr is fixed via the /proc/self/fd trick
* setxattr,removexattr are fixed by opening the file O_WRONLY
Fixes https://github.com/rfjakob/gocryptfs/issues/308
2019-01-02 20:48:46 +01:00
Jakob Unterwurzacher
bb7f919674
fusefrontend: don't downgrade type needlessly
2019-01-02 20:45:08 +01:00
Jakob Unterwurzacher
f320b76fd1
fusefrontend: use Fsetxattr/Fgetxattr/etc on all platforms
...
Darwin now also has these functions, use them. Simplifies
the code and makes it symlink-safe on Darwin as well.
2019-01-02 16:58:48 +01:00
Jakob Unterwurzacher
5aa1755cbc
fusefrontend: openBackingDir: fix fd leak in error path
...
Reported by @slackner at
932efbd459 (r31813373)
thanks!
2019-01-02 00:14:12 +01:00
Jakob Unterwurzacher
cd0ec342b9
fusefrontend: fix fd leak in error path
2019-01-01 20:49:56 +01:00
Jakob Unterwurzacher
77c3df48ef
fusefrontend: fix fd leak in Access()
...
Thanks @slackner!
Fixes https://github.com/rfjakob/gocryptfs/issues/306
2019-01-01 20:10:17 +01:00
Jakob Unterwurzacher
60e7a0ca9f
fusefrontend: xattr: fix hang on FIFOs
...
An Open() a fifo blocks until it is opened for writing.
This meant that xattr operations on FIFOs would block.
Pass O_NONBLOCK to fix that, and add a test.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
1d5500c3db
fusefrontend: only compile getBackingPath() on Darwin
...
This function is NOT symlink-safe. Darwin needs it because it lacks
fgetxattr(2) and friends.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
c3adf9729d
fusefrontend: make ListXAttr symlink-safe on Linux
...
Uses /proc/self/fd.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
d3ae87fa2b
fusefrontend: make RemoveXAttr() symlink-safe
...
Uses /proc/self/fd on Linux.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
810d2a8b47
fusefrontend: make SetXAttr() symlink-safe on Linux
...
Uses the /proc/self/fd trick.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
2286372603
fusefrontend: make GetXAttr() symlink-safe on Linux
...
Uses the /proc/self/fd trick, which does not work
on Darwin.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
a355670ca2
fusefrontend: make Utimens symlink-safe
...
unix.UtimesNanoAt now also exists on Darwin, yay!
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
abbdaa8ea4
fusefrontend: fix compile failure on Darwin
...
Failure was:
+ GOOS=darwin
+ GOARCH=amd64
+ go build -tags without_openssl
# github.com/rfjakob/gocryptfs/internal/fusefrontend
internal/fusefrontend/fs_dir.go:159:60: cannot use origMode | 448 (type uint16) as type uint32 in argument to syscallcompat.Fchmodat
internal/fusefrontend/fs_dir.go:170:33: cannot use origMode (type uint16) as type uint32 in argument to syscallcompat.Fchmodat
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
d4b7f42c3b
fusefrontend: mark Truncate, Unlink, Symlink symlink-safe
...
No changes needed.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
436f918c21
fusefrontend: make Rmdir symlink-safe
...
Now uses Unlinkat.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
2de3851abd
nametransform: rename WriteLongName() -> WriteLongNameAt()
...
And also rename DeleteLongName() -> DeleteLongNameAt(). The
naming follow the names open the openat() etc syscalls.
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
4fae240153
fusefrontend: make Readlink() symlink-safe
...
Now symlink-safe through Readlinkat().
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
21f1f858b9
fusefrontend: make OpenDir() symlink-safe
...
Interestingly, little or no performance impact:
$ ./benchmark.bash
Testing gocryptfs at /tmp/benchmark.bash.39W: gocryptfs v1.6-42-g30c2349-dirty; go-fuse v20170619-66-g6df8ddc; 2018-11-04 go1.11
Downloading linux-3.0.tar.gz
/tmp/linux-3.0.tar.gz 100%[=========================================================================>] 92.20M 2.93MB/s in 31s
2018-11-04 21:44:44 URL:https://cdn.kernel.org/pub/linux/kernel/v3.0/linux-3.0.tar.gz [96675825/96675825] -> "/tmp/linux-3.0.tar.gz" [1]
WRITE: 262144000 bytes (262 MB, 250 MiB) copied, 1.1808 s, 222 MB/s
READ: 262144000 bytes (262 MB, 250 MiB) copied, 0.866438 s, 303 MB/s
UNTAR: 24.745
MD5: 12.050
LS: 3.525
RM: 9.544
Note: kernel has been updated:
$ uname -a
Linux brikett 4.18.16-200.fc28.x86_64 #1 SMP Sat Oct 20 23:53:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
de3a2c1895
fusefrontend: mark a few more functions as symlink-safe / unsafe
2019-01-01 16:24:25 +01:00
Jakob Unterwurzacher
8586a83825
fusefrontend: use openBackingDir in ctlsock interface
...
Instead of calling syscall.Open() ourselves, rely on
openBackingDir().
2019-01-01 16:24:20 +01:00
Jakob Unterwurzacher
0c1ceed1fa
fusefrontend: make GetAttr() symlink-safe
...
Use openBackingDir() and Fstatat().
High performance impact, though part of it should be
mitigated by adding DirIV caching to the new code paths.
$ ./benchmark.bash
Testing gocryptfs at /tmp/benchmark.bash.Eou: gocryptfs v1.6-37-ge3914b3-dirty; go-fuse v20170619-66-g6df8ddc; 2018-10-14 go1.11
WRITE: 262144000 bytes (262 MB, 250 MiB) copied, 1.2289 s, 213 MB/s
READ: 262144000 bytes (262 MB, 250 MiB) copied, 1.02616 s, 255 MB/s
UNTAR: 24.490
MD5: 13.120
LS: 3.368
RM: 9.232
2019-01-01 16:24:09 +01:00
Jakob Unterwurzacher
932efbd459
fusefrontend: make openBackingDir() symlink-safe
...
openBackingDir() used encryptPath(), which is not symlink-safe
itself. Drop encryptPath() and implement our own directory walk.
Adds three seconds to untar and two seconds to rm:
$ ./benchmark.bash
Testing gocryptfs at /tmp/benchmark.bash.MzG: gocryptfs v1.6-36-g8fb3c2f-dirty; go-fuse v20170619-66-g6df8ddc; 2018-10-14 go1.11
WRITE: 262144000 bytes (262 MB, 250 MiB) copied, 1.25078 s, 210 MB/s
READ: 262144000 bytes (262 MB, 250 MiB) copied, 1.0318 s, 254 MB/s
UNTAR: 20.941
MD5: 11.568
LS: 1.638
RM: 5.337
2019-01-01 16:24:09 +01:00