From 3a614244eec068e1c65781638b34f1b5e1b15a70 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Fri, 1 Nov 2024 17:28:18 +0100 Subject: [PATCH] node: Fix mask-or operator precedence by replacing `+` with `|` A request for using masks and shifts on the known `0-1-2` constants defining the minor type of a DRM node resulted in the expression to maintain the original `+` from first subtracting the current node type followed by adding the requested node type. As the subtract of the current node type was replaced by a mask, the resulting `old_id & ID_MASK + minor_base` expression is interpreted as `old_id & (ID_MASK + minor_base)` because of operator precedence, while it would have been correctly interpreted as `(old_id & ID_MASK) | minor_base` when the correct `|` OR operator is used. --- src/node/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/node/mod.rs b/src/node/mod.rs index 5fcecb3..dc86100 100644 --- a/src/node/mod.rs +++ b/src/node/mod.rs @@ -330,8 +330,8 @@ pub fn dev_path(dev: dev_t, ty: NodeType) -> io::Result { if let Some(dev_name) = devname(dev) { let suffix = dev_name.trim_start_matches(|c: char| !c.is_numeric()); if let Ok(old_id) = suffix.parse::() { - let id_mask = 0b11_1111; - let id = old_id & id_mask + ty.minor_base(); + const ID_MASK: u32 = 0b11_1111; + let id = old_id & ID_MASK | ty.minor_base(); let path = PathBuf::from(format!("/dev/dri/{}{}", ty.minor_name_prefix(), id)); if path.exists() { return Ok(path); @@ -363,8 +363,8 @@ pub fn dev_path(dev: dev_t, ty: NodeType) -> io::Result { } let old_id = minor(dev); - let id_mask = 0b11_1111; - let id = old_id & id_mask + ty.minor_base(); + const ID_MASK: u32 = 0b11_1111; + let id = old_id & ID_MASK | ty.minor_base(); let path = PathBuf::from(format!("/dev/dri/{}{}", ty.minor_name_prefix(), id)); if path.exists() { return Ok(path);