Skip to content

Commit fb5d0bc

Browse files
committed
Harden logger
1 parent f4092a3 commit fb5d0bc

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

logger.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const MaxLogValueLength = 1024
2727
// logger *slog.Logger
2828
// }
2929
//
30-
// func (s *SlogAdapter) Debug(msg string, keysAndValues ...interface{}) {
30+
// func (s *SlogAdapter) Debug(msg string, keysAndValues ...any) {
3131
// s.logger.Debug(msg, keysAndValues...)
3232
// }
3333
// // ... implement other methods
@@ -37,10 +37,10 @@ const MaxLogValueLength = 1024
3737
// netconf.Password("secret"),
3838
// netconf.WithLogger(&SlogAdapter{logger: slog.Default()}))
3939
type Logger interface {
40-
Debug(msg string, keysAndValues ...interface{})
41-
Info(msg string, keysAndValues ...interface{})
42-
Warn(msg string, keysAndValues ...interface{})
43-
Error(msg string, keysAndValues ...interface{})
40+
Debug(msg string, keysAndValues ...any)
41+
Info(msg string, keysAndValues ...any)
42+
Warn(msg string, keysAndValues ...any)
43+
Error(msg string, keysAndValues ...any)
4444
}
4545

4646
// LogLevel represents the severity threshold for logging
@@ -102,28 +102,28 @@ func NewDefaultLogger(level LogLevel) *DefaultLogger {
102102
}
103103

104104
// Debug logs a debug message with structured key-value pairs
105-
func (l *DefaultLogger) Debug(msg string, keysAndValues ...interface{}) {
105+
func (l *DefaultLogger) Debug(msg string, keysAndValues ...any) {
106106
if l.level <= LogLevelDebug {
107107
l.log("DEBUG", msg, keysAndValues...)
108108
}
109109
}
110110

111111
// Info logs an informational message with structured key-value pairs
112-
func (l *DefaultLogger) Info(msg string, keysAndValues ...interface{}) {
112+
func (l *DefaultLogger) Info(msg string, keysAndValues ...any) {
113113
if l.level <= LogLevelInfo {
114114
l.log("INFO", msg, keysAndValues...)
115115
}
116116
}
117117

118118
// Warn logs a warning message with structured key-value pairs
119-
func (l *DefaultLogger) Warn(msg string, keysAndValues ...interface{}) {
119+
func (l *DefaultLogger) Warn(msg string, keysAndValues ...any) {
120120
if l.level <= LogLevelWarn {
121121
l.log("WARN", msg, keysAndValues...)
122122
}
123123
}
124124

125125
// Error logs an error message with structured key-value pairs
126-
func (l *DefaultLogger) Error(msg string, keysAndValues ...interface{}) {
126+
func (l *DefaultLogger) Error(msg string, keysAndValues ...any) {
127127
if l.level <= LogLevelError {
128128
l.log("ERROR", msg, keysAndValues...)
129129
}
@@ -143,7 +143,7 @@ func (l *DefaultLogger) Error(msg string, keysAndValues ...interface{}) {
143143
// Output: "user .[ERROR].Fake.attack.message"
144144
//
145145
// Returns the sanitized string value.
146-
func sanitizeLogValue(val interface{}) string {
146+
func sanitizeLogValue(val any) string {
147147
str := fmt.Sprintf("%v", val)
148148

149149
// Truncate long values to prevent log file DoS
@@ -164,6 +164,11 @@ func sanitizeLogValue(val interface{}) string {
164164
decoded, size := utf8.DecodeRuneInString(str[i:])
165165
if decoded == utf8.RuneError {
166166
builder.WriteRune('.')
167+
// CRITICAL: Must advance index even on error to prevent infinite loop
168+
if size == 0 {
169+
size = 1 // Ensure forward progress on malformed UTF-8
170+
}
171+
i += size - 1
167172
continue
168173
}
169174

@@ -214,7 +219,7 @@ func sanitizeLogValue(val interface{}) string {
214219
// All key-value pairs are sanitized to prevent log injection attacks and
215220
// enforce size limits. The message string is NOT sanitized as it comes from
216221
// trusted sources (the library code itself).
217-
func (l *DefaultLogger) log(level, msg string, keysAndValues ...interface{}) {
222+
func (l *DefaultLogger) log(level, msg string, keysAndValues ...any) {
218223
if l.level > logLevelFromString(level) {
219224
return
220225
}
@@ -284,13 +289,13 @@ func logLevelFromString(level string) LogLevel {
284289
type NoOpLogger struct{}
285290

286291
// Debug discards the log message
287-
func (n *NoOpLogger) Debug(_ string, _ ...interface{}) {}
292+
func (n *NoOpLogger) Debug(_ string, _ ...any) {}
288293

289294
// Info discards the log message
290-
func (n *NoOpLogger) Info(_ string, _ ...interface{}) {}
295+
func (n *NoOpLogger) Info(_ string, _ ...any) {}
291296

292297
// Warn discards the log message
293-
func (n *NoOpLogger) Warn(_ string, _ ...interface{}) {}
298+
func (n *NoOpLogger) Warn(_ string, _ ...any) {}
294299

295300
// Error discards the log message
296-
func (n *NoOpLogger) Error(_ string, _ ...interface{}) {}
301+
func (n *NoOpLogger) Error(_ string, _ ...any) {}

0 commit comments

Comments
 (0)