aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-03-03 19:56:52 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-03-03 19:56:52 +0400
commit2750b2038bed5495bcdfeacc7be25267d15ceab1 (patch)
tree9e118e54af316ee9813ffdcde884c8870d5c036d /src/backend
parentc4145b014af59ea13760663755e9410b19501d0f (diff)
downloadniri-2750b2038bed5495bcdfeacc7be25267d15ceab1.tar.gz
niri-2750b2038bed5495bcdfeacc7be25267d15ceab1.tar.bz2
niri-2750b2038bed5495bcdfeacc7be25267d15ceab1.zip
Catch panics from edid-rs
Work around an integer overflow. See: https://github.com/YaLTeR/niri/issues/239
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/tty.rs19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs
index 77b88cc8..e9d7a9cb 100644
--- a/src/backend/tty.rs
+++ b/src/backend/tty.rs
@@ -1,6 +1,7 @@
use std::cell::RefCell;
use std::collections::{HashMap, HashSet};
use std::fmt::Write;
+use std::panic::{catch_unwind, AssertUnwindSafe};
use std::path::Path;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
@@ -644,7 +645,7 @@ impl Tty {
if non_desktop {
debug!("output is non desktop");
- let description = EdidInfo::for_connector(&device.drm, connector.handle())
+ let description = get_edid_info(&device.drm, connector.handle())
.map(|info| truncate_to_nul(info.model))
.unwrap_or_else(|| "Unknown".into());
device.drm_lease_state.add_connector::<State>(
@@ -704,7 +705,7 @@ impl Tty {
// Update the output mode.
let (physical_width, physical_height) = connector.size().unwrap_or((0, 0));
- let (make, model) = EdidInfo::for_connector(&device.drm, connector.handle())
+ let (make, model) = get_edid_info(&device.drm, connector.handle())
.map(|info| {
(
truncate_to_nul(info.manufacturer),
@@ -1250,7 +1251,7 @@ impl Tty {
let physical_size = connector.size();
- let (make, model) = EdidInfo::for_connector(&device.drm, connector.handle())
+ let (make, model) = get_edid_info(&device.drm, connector.handle())
.map(|info| {
(
truncate_to_nul(info.manufacturer),
@@ -1755,6 +1756,18 @@ fn truncate_to_nul(mut s: String) -> String {
s
}
+fn get_edid_info(device: &DrmDevice, connector: connector::Handle) -> Option<EdidInfo> {
+ match catch_unwind(AssertUnwindSafe(move || {
+ EdidInfo::for_connector(device, connector)
+ })) {
+ Ok(info) => info,
+ Err(err) => {
+ warn!("edid-rs panicked: {err:?}");
+ None
+ }
+ }
+}
+
#[cfg(test)]
mod tests {
use super::*;