git.delta.rocks / jrsonnet / refs/commits / f28c97b01543

difftreelog

fix logs may contain non-utf8 lines, use lossy conversion

nruokynsYaroslav Bolyukin2025-09-10parent: #3a7032e.patch.diff
in: trunk

2 files changed

modifiedcrates/nix-eval/src/logging.ccdiffbeforeafterboth
--- 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<const unsigned char> str(reinterpret_cast<const unsigned char*>(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<const unsigned char> str(reinterpret_cast<const unsigned char*>(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<const unsigned char> str(reinterpret_cast<const unsigned char*>(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<const unsigned char> str(reinterpret_cast<const unsigned char*>(s->data()), s->size());
+        b->add_string_field(str);
       } else {
         unreachable();
       }
modifiedcrates/nix-eval/src/logging.rsdiffbeforeafterboth
300 fn add_int_field(&mut self, i: i32) {300 fn add_int_field(&mut self, i: i32) {
301 self.fields.push(FieldValue::Int(i));301 self.fields.push(FieldValue::Int(i));
302 }302 }
303 fn add_string_field(&mut self, v: &str) {303 fn add_string_field(&mut self, v: &[u8]) {
304 let v = String::from_utf8_lossy(v);
304 self.fields.push(FieldValue::Str(v.to_owned()));305 self.fields.push(FieldValue::Str(v.to_string()));
305 }306 }
306 fn emit(&mut self, parent: u64, s: &str) {307 fn emit(&mut self, parent: u64, s: &str) {
307 let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");308 let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");
455 let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");456 let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");
456 mapping.remove(&v);457 mapping.remove(&v);
457}458}
458fn emit_log(lvl: u32, v: &str) {459fn emit_log(lvl: u32, v: &[u8]) {
459 let verbosity = Verbosity::from_int(lvl);460 let verbosity = Verbosity::from_int(lvl);
460 let level: Level = verbosity.into();461 let level: Level = verbosity.into();
462 let v = String::from_utf8_lossy(v);
461 if level == Level::ERROR {463 if level == Level::ERROR {
462 error!(target: "nix", "{v}")464 error!(target: "nix", "{v}")
463 } else if level == Level::WARN {465 } else if level == Level::WARN {
539 type StartActivityBuilder;541 type StartActivityBuilder;
540 fn new_start_activity(activity_id: u64, lvl: u32, typ: u32) -> Box<StartActivityBuilder>;542 fn new_start_activity(activity_id: u64, lvl: u32, typ: u32) -> Box<StartActivityBuilder>;
541 fn add_int_field(&mut self, i: i32);543 fn add_int_field(&mut self, i: i32);
542 fn add_string_field(&mut self, v: &str);544 fn add_string_field(&mut self, v: &[u8]);
543 fn emit(&mut self, parent: u64, s: &str);545 fn emit(&mut self, parent: u64, s: &str);
544 fn emit_result(&mut self, ty: u32);546 fn emit_result(&mut self, ty: u32);
545547
546 fn emit_warn(v: &str);548 fn emit_warn(v: &str);
547 fn emit_stop(id: u64);549 fn emit_stop(id: u64);
548 fn emit_log(lvl: u32, v: &str);550 fn emit_log(lvl: u32, v: &[u8]);
549 }551 }
550 unsafe extern "C++" {552 unsafe extern "C++" {
551 include!("nix-eval/src/logging.hh");553 include!("nix-eval/src/logging.hh");