Otherwise we fail like this on my Fedora 38 box:
=== RUN TestOverlay
DetectQuirks: tmpfs detected, no extended attributes except acls will work.
root_test.go:379: No user xattrs! overlay mount will likely fail.
15:15:57.957960 Unimplemented opcode OPCODE-51
root_test.go:398: mount: /tmp/gocryptfs-test-parent-0/3652394902/TestOverlay.2374697046.mnt/merged: wrong fs type, bad option, bad superblock on overlay, missing codepage or helper program, or other error.
dmesg(1) may have more information after failed mount system call.
root_test.go:399: exit status 32
--- FAIL: TestOverlay (0.04s)
FAIL
Also fix the messed-up DetectQuirks bit test.
Looks like I used StringSliceVar (which splits on comma)
where I should have always used StringArrayVar (which does not).
Bug report contains this example of misbehavoir:
#gocryptfs -extpass 'echo abc,123' -init testdir
Reading password from extpass program "echo abc", arguments: ["123"]
extpass cmd start failed: exec: "echo abc": executable file not found in $PATH
Fixes https://github.com/rfjakob/gocryptfs/issues/730
It used to be reported as "function not implemented", accompanied
with this log output:
go-fuse: can't convert error type: ParseHeader: header is all-zero. Header hexdump: 000000000000000000000000000000000000
Now we report EIO and log this:
doWrite 1372183: corrupt header: ParseHeader: header is all-zero. Header hexdump: 000000000000000000000000000000000000
On Go 1.17 and older we get this:
Error: ./version.go:67:24: info.Settings undefined (type *debug.BuildInfo has no field or method Settings)
Fix the build error by shedding some nice-to-have features.
Go1.12 introduced BuildInfo which embeds build information. It does
not embed build date to facilitate reproducable builds by default.
If build information is embedded from build script, use the information
provided by the Go build system.
Fails right now as reported in https://github.com/rfjakob/gocryptfs/pull/655
--- FAIL: TestLongnamemax100Reverse (0.09s)
longnamemax_test.go:104: l=64: should see a longname now
longnamemax_test.go:104: l=65: should see a longname now
longnamemax_test.go:104: l=66: should see a longname now
longnamemax_test.go:104: l=67: should see a longname now
longnamemax_test.go:104: l=68: should see a longname now
longnamemax_test.go:104: l=69: should see a longname now
longnamemax_test.go:104: l=70: should see a longname now
longnamemax_test.go:104: l=71: should see a longname now
longnamemax_test.go:104: l=72: should see a longname now
longnamemax_test.go:104: l=73: should see a longname now
longnamemax_test.go:104: l=74: should see a longname now
longnamemax_test.go:104: l=75: should see a longname now
longnamemax_test.go:104: l=76: should see a longname now
longnamemax_test.go:104: l=77: should see a longname now
longnamemax_test.go:104: l=78: should see a longname now
longnamemax_test.go:104: l=79: should see a longname now
longnamemax_test.go:104: l=80: should see a longname now
longnamemax_test.go:104: l=81: should see a longname now
longnamemax_test.go:104: l=82: should see a longname now
longnamemax_test.go:104: l=83: should see a longname now
longnamemax_test.go:104: l=84: should see a longname now
longnamemax_test.go:104: l=85: should see a longname now
longnamemax_test.go:104: l=86: should see a longname now
longnamemax_test.go:104: l=87: should see a longname now
longnamemax_test.go:104: l=88: should see a longname now
longnamemax_test.go:104: l=89: should see a longname now
longnamemax_test.go:104: l=90: should see a longname now
longnamemax_test.go:104: l=91: should see a longname now
longnamemax_test.go:104: l=92: should see a longname now
longnamemax_test.go:104: l=93: should see a longname now
longnamemax_test.go:104: l=94: should see a longname now
longnamemax_test.go:104: l=95: should see a longname now
longnamemax_test.go:104: l=96: should see a longname now
longnamemax_test.go:104: l=97: should see a longname now
longnamemax_test.go:104: l=98: should see a longname now
longnamemax_test.go:104: l=99: should see a longname now
longnamemax_test.go:104: l=100: should see a longname now
longnamemax_test.go:104: l=101: should see a longname now
longnamemax_test.go:104: l=102: should see a longname now
longnamemax_test.go:104: l=103: should see a longname now
longnamemax_test.go:104: l=104: should see a longname now
longnamemax_test.go:104: l=105: should see a longname now
longnamemax_test.go:104: l=106: should see a longname now
longnamemax_test.go:104: l=107: should see a longname now
longnamemax_test.go:104: l=108: should see a longname now
longnamemax_test.go:104: l=109: should see a longname now
longnamemax_test.go:104: l=110: should see a longname now
longnamemax_test.go:104: l=111: should see a longname now
longnamemax_test.go:104: l=112: should see a longname now
longnamemax_test.go:104: l=113: should see a longname now
longnamemax_test.go:104: l=114: should see a longname now
longnamemax_test.go:104: l=115: should see a longname now
longnamemax_test.go:104: l=116: should see a longname now
longnamemax_test.go:104: l=117: should see a longname now
longnamemax_test.go:104: l=118: should see a longname now
longnamemax_test.go:104: l=119: should see a longname now
longnamemax_test.go:104: l=120: should see a longname now
longnamemax_test.go:104: l=121: should see a longname now
longnamemax_test.go:104: l=122: should see a longname now
longnamemax_test.go:104: l=123: should see a longname now
longnamemax_test.go:104: l=124: should see a longname now
longnamemax_test.go:104: l=125: should see a longname now
longnamemax_test.go:104: l=126: should see a longname now
longnamemax_test.go:104: l=127: should see a longname now
longnamemax_test.go:104: l=128: should see a longname now
longnamemax_test.go:104: l=129: should see a longname now
longnamemax_test.go:104: l=130: should see a longname now
longnamemax_test.go:104: l=131: should see a longname now
longnamemax_test.go:104: l=132: should see a longname now
longnamemax_test.go:104: l=133: should see a longname now
longnamemax_test.go:104: l=134: should see a longname now
longnamemax_test.go:104: l=135: should see a longname now
longnamemax_test.go:104: l=136: should see a longname now
longnamemax_test.go:104: l=137: should see a longname now
longnamemax_test.go:104: l=138: should see a longname now
longnamemax_test.go:104: l=139: should see a longname now
longnamemax_test.go:104: l=140: should see a longname now
longnamemax_test.go:104: l=141: should see a longname now
longnamemax_test.go:104: l=142: should see a longname now
longnamemax_test.go:104: l=143: should see a longname now
longnamemax_test.go:104: l=144: should see a longname now
longnamemax_test.go:104: l=145: should see a longname now
longnamemax_test.go:104: l=146: should see a longname now
longnamemax_test.go:104: l=147: should see a longname now
longnamemax_test.go:104: l=148: should see a longname now
longnamemax_test.go:104: l=149: should see a longname now
longnamemax_test.go:104: l=150: should see a longname now
longnamemax_test.go:104: l=151: should see a longname now
longnamemax_test.go:104: l=152: should see a longname now
longnamemax_test.go:104: l=153: should see a longname now
longnamemax_test.go:104: l=154: should see a longname now
longnamemax_test.go:104: l=155: should see a longname now
longnamemax_test.go:104: l=156: should see a longname now
longnamemax_test.go:104: l=157: should see a longname now
longnamemax_test.go:104: l=158: should see a longname now
longnamemax_test.go:104: l=159: should see a longname now
longnamemax_test.go:104: l=160: should see a longname now
longnamemax_test.go:104: l=161: should see a longname now
longnamemax_test.go:104: l=162: should see a longname now
longnamemax_test.go:104: l=163: should see a longname now
longnamemax_test.go:104: l=164: should see a longname now
longnamemax_test.go:104: l=165: should see a longname now
longnamemax_test.go:104: l=166: should see a longname now
longnamemax_test.go:104: l=167: should see a longname now
longnamemax_test.go:104: l=168: should see a longname now
longnamemax_test.go:104: l=169: should see a longname now
longnamemax_test.go:104: l=170: should see a longname now
longnamemax_test.go:104: l=171: should see a longname now
longnamemax_test.go:104: l=172: should see a longname now
longnamemax_test.go:104: l=173: should see a longname now
longnamemax_test.go:104: l=174: should see a longname now
longnamemax_test.go:104: l=175: should see a longname now
FAIL
https://github.com/rfjakob/gocryptfs/pull/655
Unlike the FUSE implementation on Linux, macFUSE doesn't cache the file
attributes from the `LOOKUP` call, so it calls `GETATTR` prior to
accessing a file.
In the case of the `VirtualConfNode` (reverse config file passthrough),
this resulted in the default `GETATTR` implementation returning an empty
result, ultimately resulting in a "permission denied" error.
14:44:14.095207 rx 3: GETATTR n2
14:44:14.095229 tx 3: OK, {tA=1s {M0100000 SZ=0 L=0 0:0 0 0:8954996 A 0.000000 M 0.000000 C 0.000000}}
14:44:14.099943 rx 4: ACCESS n2 {u=501 g=20 r}
14:44:14.099990 tx 4: 13=permission denied
By impementing `Getattr` (from `fs.NodeGetattrer`) on `VirtualConfNode`
this solves the issue.
$ ./crossbuild.bash
[...]
+ GOOS=darwin
+ GOARCH=amd64
+ build
+ go build -tags without_openssl -o /dev/null
internal/fusefrontend/node.go:397:2: duplicate case syscallcompat.RENAME_NOREPLACE (value 0) in switch
previous case at internal/fusefrontend/node.go:397:7
internal/fusefrontend/node.go:397:2: duplicate case syscallcompat.RENAME_EXCHANGE (value 0) in switch
previous case at internal/fusefrontend/node.go:397:7
internal/fusefrontend/node.go:397:2: duplicate case syscallcompat.RENAME_WHITEOUT (value 0) in switch
previous case at internal/fusefrontend/node.go:397:7
internal/fusefrontend/node.go:399:38: duplicate case syscallcompat.RENAME_NOREPLACE | syscallcompat.RENAME_WHITEOUT (value 0) in switch
previous case at internal/fusefrontend/node.go:397:7