aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-14 19:49:34 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-14 19:49:34 +0400
commit78cda2e67fe8cee66ec1b64914031430aedd8733 (patch)
tree41f1ead1eddb64d65f943b445c5158ef8eca1586 /src
parent924e21f69b4f0a59e83637f2ba04ba1ef2360beb (diff)
downloadniri-78cda2e67fe8cee66ec1b64914031430aedd8733.tar.gz
niri-78cda2e67fe8cee66ec1b64914031430aedd8733.tar.bz2
niri-78cda2e67fe8cee66ec1b64914031430aedd8733.zip
tty: Truncate Edid strings to nul
Otherwise they crash in wayland-rs when converting to CString.
Diffstat (limited to 'src')
-rw-r--r--src/backend/tty.rs44
1 files changed, 41 insertions, 3 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index 9caaf440..d9e2ba43 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -652,7 +652,7 @@ impl Tty {
if non_desktop {
debug!("output is non desktop");
let description = EdidInfo::for_connector(&device.drm, connector.handle())
- .map(|info| info.model)
+ .map(|info| truncate_to_nul(info.model))
.unwrap_or_else(|| "Unknown".into());
device.drm_lease_state.add_connector::<State>(
connector.handle(),
@@ -712,7 +712,12 @@ impl Tty {
let (physical_width, physical_height) = connector.size().unwrap_or((0, 0));
let (make, model) = EdidInfo::for_connector(&device.drm, connector.handle())
- .map(|info| (info.manufacturer, info.model))
+ .map(|info| {
+ (
+ truncate_to_nul(info.manufacturer),
+ truncate_to_nul(info.model),
+ )
+ })
.unwrap_or_else(|| ("Unknown".into(), "Unknown".into()));
let output = Output::new(
@@ -1239,7 +1244,12 @@ impl Tty {
let physical_size = connector.size();
let (make, model) = EdidInfo::for_connector(&device.drm, connector.handle())
- .map(|info| (info.manufacturer, info.model))
+ .map(|info| {
+ (
+ truncate_to_nul(info.manufacturer),
+ truncate_to_nul(info.model),
+ )
+ })
.unwrap_or_else(|| ("Unknown".into(), "Unknown".into()));
let modes = connector
@@ -1697,3 +1707,31 @@ fn pick_mode(
mode.map(|m| (*m, fallback))
}
+
+fn truncate_to_nul(mut s: String) -> String {
+ if let Some(index) = s.find('\0') {
+ s.truncate(index);
+ }
+ s
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[track_caller]
+ fn check(input: &str, expected: &str) {
+ let input = String::from(input);
+ assert_eq!(truncate_to_nul(input), expected);
+ }
+
+ #[test]
+ fn truncate_to_nul_works() {
+ check("", "");
+ check("qwer", "qwer");
+ check("abc\0def", "abc");
+ check("\0as", "");
+ check("a\0\0\0b", "a");
+ check("bb😁\0cc", "bb😁");
+ }
+}