From 2d01d5f2d4bb1fc9c7a7bb9165edcef42d4f89c6 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 23 Sep 2018 11:11:01 +0200 Subject: [PATCH] tlog: always trim trailing newlines The messages we print through tlog sometimes do, sometimes do not contain a trailing newline. The stdlib logger usually drops trailing newlines automatically, but tlog postfixes ColorReset to the caller's message, so the logger logic does not work when we print colored output. Drop the newlines on our own, and add a test. Fixes the blank lines in fsck output: ~/go/src/github.com/rfjakob/gocryptfs/tests/fsck$ ./run_fsck.bash Reading password from extpass program Decrypting master key OpenDir "": invalid entry "invalid_file_name.3": illegal base64 data at input byte 17 OpenDir "": invalid entry "invalid_file_name_2": bad message fsck: corrupt entry in dir "": "invalid_file_name.3" fsck: corrupt entry in dir "": "invalid_file_name_2" OpenDir "": invalid entry "invalid_file_name____1": bad message fsck: corrupt entry in dir "": "invalid_file_name____1" doRead 4327225: corrupt block #0: stupidgcm: message authentication failed fsck: error reading file "corrupt_file" (inum 4327225): 5=input/output error cipherSize 40 < overhead 50: corrupt file doRead 4327074: corrupt header: ParseHeader: invalid version, want=2 have=22616 cipherSize 40 < overhead 50: corrupt file fsck: error reading file "corrupt_file_2" (inum 4327074): 5=input/output error Readlink "s-P7PcQDUcVkoeMDnC3EYA": decrypting target failed: stupidgcm: message authentication failed fsck: error reading symlink "corrupt_symlink": 5=input/output error Readlink "iI0MtUdzELPeOAZYwYZFee169hpGgd3l2PXQBcc9sl4": decrypting target failed: illegal base64 data at input byte 0 fsck: error reading symlink "corrupt_symlink_2": 5=input/output error OpenDir "yrwcjj2qoC4IYvhw9sbfRg": could not read gocryptfs.diriv: wanted 16 bytes, got 17 fsck: error opening dir "diriv_too_long": 5=input/output error OpenDir "trqecbMNXdzLqzpk7fSfKw": could not read gocryptfs.diriv: wanted 16 bytes, got 3 fsck: error opening dir "diriv_too_short": 5=input/output error cipherSize 8 < header size 18: corrupt file readFileID 4327049: incomplete file, got 8 instead of 19 bytes fsck: corrupt file "incomplete_file_1" (inode 4327049) readFileID 4327038: incomplete file, got 18 instead of 19 bytes fsck: corrupt file "incomplete_file_2" (inode 4327038) cipherSize 1 < header size 18: corrupt file readFileID 4327063: incomplete file, got 1 instead of 19 bytes fsck: corrupt file "incomplete_file_3" (inode 4327063) fsck: error opening dir "missing_diriv": 2=no such file or directory ListXAttr: invalid xattr name "user.gocryptfs.0a5e7yWl0SGUGeWB0Sy2K0": bad message fsck: corrupt xattr name on file "xattr_corrupt_name": "user.gocryptfs.0a5e7yWl0SGUGeWB0Sy2K0" GetXAttr: stupidgcm: message authentication failed fsck: error reading xattr "user.foo" from "xattr_corrupt_value": 5=input/output error fsck summary: 15 corrupt files --- internal/tlog/log.go | 21 +++++++++++++++++---- internal/tlog/tlog_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 internal/tlog/tlog_test.go diff --git a/internal/tlog/log.go b/internal/tlog/log.go index 9277abd..9ebe535 100644 --- a/internal/tlog/log.go +++ b/internal/tlog/log.go @@ -57,22 +57,35 @@ type toggledLogger struct { Logger *log.Logger } +// trimNewline removes one trailing newline from "msg" +func trimNewline(msg string) string { + if len(msg) == 0 { + return msg + } + if msg[len(msg)-1] == '\n' { + return msg[:len(msg)-1] + } + return msg +} + func (l *toggledLogger) Printf(format string, v ...interface{}) { if !l.Enabled { return } - l.Logger.Printf(l.prefix + fmt.Sprintf(format, v...) + l.postfix) + msg := trimNewline(fmt.Sprintf(format, v...)) + l.Logger.Printf(l.prefix + msg + l.postfix) if l.Wpanic { - l.Logger.Panic(wpanicMsg + fmt.Sprintf(format, v...)) + l.Logger.Panic(wpanicMsg + msg) } } func (l *toggledLogger) Println(v ...interface{}) { if !l.Enabled { return } - l.Logger.Println(l.prefix + fmt.Sprint(v...) + l.postfix) + msg := trimNewline(fmt.Sprint(v...)) + l.Logger.Println(l.prefix + msg + l.postfix) if l.Wpanic { - l.Logger.Panic(wpanicMsg + fmt.Sprint(v...)) + l.Logger.Panic(wpanicMsg + msg) } } diff --git a/internal/tlog/tlog_test.go b/internal/tlog/tlog_test.go new file mode 100644 index 0000000..2e1c034 --- /dev/null +++ b/internal/tlog/tlog_test.go @@ -0,0 +1,26 @@ +package tlog + +import ( + "testing" +) + +// Test that trimNewline() works as expected +func TestTrimNewline(t *testing.T) { + testTable := []struct { + in string + want string + }{ + {"...\n", "..."}, + {"\n...\n", "\n..."}, + {"", ""}, + {"\n", ""}, + {"\n\n", "\n"}, + {" ", " "}, + } + for _, v := range testTable { + have := trimNewline(v.in) + if v.want != have { + t.Errorf("want=%q have=%q", v.want, have) + } + } +}