difftreelog
fix logs may contain non-utf8 lines, use lossy conversion
in: trunk
2 files changed
crates/nix-eval/src/logging.ccdiffbeforeafterboth9910 bool isVerbose() override { return true; }10 bool isVerbose() override { return true; }11 void log(Verbosity lvl, std::string_view s) override {11 void log(Verbosity lvl, std::string_view s) override {12 rust::Str str(s.data(), s.size());12 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s.data()), s.size());13 emit_log(lvl, str);13 emit_log(lvl, str);14 }14 }15 void logEI(const ErrorInfo &ei) override { emit_log(ei.level, ei.msg.str()); }15 void logEI(const ErrorInfo &ei) override {16 auto s = ei.msg.str();17 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s.data()), s.size());18 emit_log(ei.level, str);19 }162017 void startActivity(ActivityId act, Verbosity lvl, ActivityType type,21 void startActivity(ActivityId act, Verbosity lvl, ActivityType type,22 if (f.type == Logger::Field::tInt) {26 if (f.type == Logger::Field::tInt) {23 b->add_int_field(f.i);27 b->add_int_field(f.i);24 } else if (f.type == Logger::Field::tString) {28 } else if (f.type == Logger::Field::tString) {29 auto s = &f.s;30 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s->data()), s->size());25 b->add_string_field(f.s);31 b->add_string_field(str);26 } else {32 } else {27 unreachable();33 unreachable();28 }34 }38 if (f.type == Logger::Field::tInt) {44 if (f.type == Logger::Field::tInt) {39 b->add_int_field(f.i);45 b->add_int_field(f.i);40 } else if (f.type == Logger::Field::tString) {46 } else if (f.type == Logger::Field::tString) {47 auto s = &f.s;48 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s->data()), s->size());41 b->add_string_field(f.s);49 b->add_string_field(str);42 } else {50 } else {43 unreachable();51 unreachable();44 }52 }crates/nix-eval/src/logging.rsdiffbeforeafterboth--- 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<StartActivityBuilder>;
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");