Skip to content

Commit 081bc4e

Browse files
authored
Merge pull request #583 from jf2048/no-log-escaping
glib: Use "%s" instead of replacing % in log functions
2 parents ec95d4e + afa86ca commit 081bc4e

File tree

2 files changed

+12
-58
lines changed

2 files changed

+12
-58
lines changed

glib/src/bridged_logging.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ impl GlibLogger {
122122
crate::ffi::g_log(
123123
domain.to_glib_none().0,
124124
GlibLogger::level_to_glib(level),
125-
message.replace("%", "%%").to_glib_none().0,
125+
b"%s\0".as_ptr() as *const i8,
126+
ToGlibPtr::<*const i8>::to_glib_none(message).0,
126127
);
127128
}
128129
}
@@ -152,7 +153,8 @@ impl GlibLogger {
152153
file.to_glib_none().0,
153154
line_str.to_glib_none().0,
154155
func.to_glib_none().0,
155-
message.replace("%", "%%").to_glib_none().0,
156+
b"%s\0".as_ptr() as *const i8,
157+
ToGlibPtr::<*const i8>::to_glib_none(message).0,
156158
);
157159
}
158160
}

glib/src/log.rs

Lines changed: 8 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -339,41 +339,16 @@ macro_rules! g_log_inner {
339339
fn check_log_args(_log_level: LogLevel, _format: &str) {}
340340

341341
check_log_args($log_level, $format);
342-
343-
// Replace literal percentage signs with two so that they are not interpreted as printf
344-
// format specifiers
345-
struct GWrite($crate::GStringBuilder);
346-
347-
impl fmt::Write for GWrite {
348-
fn write_str(&mut self, mut s: &str) -> ::std::result::Result<(), fmt::Error> {
349-
while let Some((prefix, suffix)) = s.split_once('%') {
350-
self.0.append(prefix);
351-
self.0.append("%%");
352-
s = suffix;
353-
}
354-
self.0.append(s);
355-
Ok(())
356-
}
357-
358-
fn write_char(&mut self, c: char) -> fmt::Result {
359-
if c == '%' {
360-
self.0.append("%%");
361-
} else {
362-
self.0.append_c(c);
363-
}
364-
Ok(())
365-
}
366-
}
367-
368-
let mut w = GWrite($crate::GStringBuilder::default());
342+
let mut w = $crate::GStringBuilder::default();
369343

370344
// Can't really happen but better safe than sorry
371345
if !std::write!(&mut w, $format, $($arg),*).is_err() {
372346
unsafe {
373347
$crate::ffi::g_log(
374348
$log_domain,
375349
$log_level.into_glib(),
376-
w.0.into_string().to_glib_none().0,
350+
b"%s\0".as_ptr() as *const i8,
351+
ToGlibPtr::<*const i8>::to_glib_none(&w.into_string()).0,
377352
);
378353
}
379354
}
@@ -666,38 +641,15 @@ macro_rules! g_print_inner {
666641
fn check_arg(_format: &str) {}
667642

668643
check_arg($format);
669-
670-
// Replace literal percentage signs with two so that they are not interpreted as printf
671-
// format specifiers
672-
struct GWrite($crate::GStringBuilder);
673-
674-
impl fmt::Write for GWrite {
675-
fn write_str(&mut self, mut s: &str) -> ::std::result::Result<(), fmt::Error> {
676-
while let Some((prefix, suffix)) = s.split_once('%') {
677-
self.0.append(prefix);
678-
self.0.append("%%");
679-
s = suffix;
680-
}
681-
self.0.append(s);
682-
Ok(())
683-
}
684-
685-
fn write_char(&mut self, c: char) -> fmt::Result {
686-
if c == '%' {
687-
self.0.append("%%");
688-
} else {
689-
self.0.append_c(c);
690-
}
691-
Ok(())
692-
}
693-
}
694-
695-
let mut w = GWrite($crate::GStringBuilder::default());
644+
let mut w = $crate::GStringBuilder::default();
696645

697646
// Can't really happen but better safe than sorry
698647
if !std::write!(&mut w, $format, $($arg),*).is_err() {
699648
unsafe {
700-
$crate::ffi::$func(w.0.into_string().to_glib_none().0);
649+
$crate::ffi::$func(
650+
b"%s\0".as_ptr() as *const i8,
651+
ToGlibPtr::<*const i8>::to_glib_none(&w.into_string()).0,
652+
);
701653
}
702654
}
703655
}};

0 commit comments

Comments
 (0)