From f28c97b01543359115633b06d24211b3b33f22c0 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Wed, 10 Sep 2025 01:14:56 +0000 Subject: [PATCH] fix: logs may contain non-utf8 lines, use lossy conversion --- --- a/crates/nix-eval/src/logging.cc +++ b/crates/nix-eval/src/logging.cc @@ -9,10 +9,14 @@ bool isVerbose() override { return true; } void log(Verbosity lvl, std::string_view s) override { - rust::Str str(s.data(), s.size()); + rust::Slice str(reinterpret_cast(s.data()), s.size()); emit_log(lvl, str); } - void logEI(const ErrorInfo &ei) override { emit_log(ei.level, ei.msg.str()); } + void logEI(const ErrorInfo &ei) override { + auto s = ei.msg.str(); + rust::Slice str(reinterpret_cast(s.data()), s.size()); + emit_log(ei.level, str); + } void startActivity(ActivityId act, Verbosity lvl, ActivityType type, const std::string &s, const Fields &fields, @@ -22,7 +26,9 @@ if (f.type == Logger::Field::tInt) { b->add_int_field(f.i); } else if (f.type == Logger::Field::tString) { - b->add_string_field(f.s); + auto s = &f.s; + rust::Slice str(reinterpret_cast(s->data()), s->size()); + b->add_string_field(str); } else { unreachable(); } @@ -38,7 +44,9 @@ if (f.type == Logger::Field::tInt) { b->add_int_field(f.i); } else if (f.type == Logger::Field::tString) { - b->add_string_field(f.s); + auto s = &f.s; + rust::Slice str(reinterpret_cast(s->data()), s->size()); + b->add_string_field(str); } else { unreachable(); } --- a/crates/nix-eval/src/logging.rs +++ b/crates/nix-eval/src/logging.rs @@ -300,8 +300,9 @@ fn add_int_field(&mut self, i: i32) { self.fields.push(FieldValue::Int(i)); } - fn add_string_field(&mut self, v: &str) { - self.fields.push(FieldValue::Str(v.to_owned())); + fn add_string_field(&mut self, v: &[u8]) { + let v = String::from_utf8_lossy(v); + self.fields.push(FieldValue::Str(v.to_string())); } fn emit(&mut self, parent: u64, s: &str) { let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned"); @@ -455,9 +456,10 @@ let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned"); mapping.remove(&v); } -fn emit_log(lvl: u32, v: &str) { +fn emit_log(lvl: u32, v: &[u8]) { let verbosity = Verbosity::from_int(lvl); let level: Level = verbosity.into(); + let v = String::from_utf8_lossy(v); if level == Level::ERROR { error!(target: "nix", "{v}") } else if level == Level::WARN { @@ -539,13 +541,13 @@ type StartActivityBuilder; fn new_start_activity(activity_id: u64, lvl: u32, typ: u32) -> Box; fn add_int_field(&mut self, i: i32); - fn add_string_field(&mut self, v: &str); + fn add_string_field(&mut self, v: &[u8]); fn emit(&mut self, parent: u64, s: &str); fn emit_result(&mut self, ty: u32); fn emit_warn(v: &str); fn emit_stop(id: u64); - fn emit_log(lvl: u32, v: &str); + fn emit_log(lvl: u32, v: &[u8]); } unsafe extern "C++" { include!("nix-eval/src/logging.hh"); -- gitstuff