From d8f6d4087de8200fdbbefbc6fe1cf2571897c741 Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Mon, 12 Feb 2024 09:17:29 +0100 Subject: Fix potential wrong fd count for poll in ALSA plugin --- alsa/src/runnable.rs | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'alsa/src/runnable.rs') diff --git a/alsa/src/runnable.rs b/alsa/src/runnable.rs index d307a23..71925a3 100644 --- a/alsa/src/runnable.rs +++ b/alsa/src/runnable.rs @@ -1,7 +1,7 @@ use std::{cell::RefCell, fmt::Display, error::Error, ffi::{CStr, CString}}; use formatable_float::FormattingError; -use libc::{c_int, c_char, c_uint, c_void, c_long, c_ushort, c_short}; +use libc::{c_int, c_char, c_uint, c_void, c_long, c_ushort, c_short, nfds_t}; use swaystatus_plugin::*; use crate::{communication::MessagesFromMainReceiver, config::SElemAbstraction}; @@ -54,25 +54,21 @@ impl<'r> AlsaVolumeRunnable<'r> { if descriptor_count < 0 { return Err(AlsaVolumeError::FailedToGetPollDescriptors); } - let mut descriptors : Vec = std::iter::once(libc::pollfd{ - fd: self.from_main.file_handle().get_raw(), - events: libc::POLLIN, - revents: 0 - }) - .chain(std::iter::repeat( - libc::pollfd{ - fd: 0, - events: 0, - revents: 0, - } - )) - .take(descriptor_count as usize + 1) - .collect(); + let mut descriptors : Vec = vec![libc::pollfd{ + fd: 0, + events: 0, + revents: 0, + }; descriptor_count as usize + 1]; + descriptors[0] = libc::pollfd{ + fd: self.from_main.file_handle().get_raw(), + events: libc::POLLIN, + revents: 0 + }; let descriptor_count = if descriptor_count > 0 { unsafe {snd_mixer_poll_descriptors(mixer.handle, &mut descriptors[1] , descriptor_count as c_uint)} } else { 0 }; if descriptor_count < 0 { return Err(AlsaVolumeError::FailedToGetPollDescriptors); } - let n = unsafe {libc::poll(descriptors.as_mut_ptr(), descriptors.len() as u64, -1)}; + let n = unsafe {libc::poll(descriptors.as_mut_ptr(),descriptor_count as nfds_t + 1, -1)}; if n < 0 && n != libc::EINTR { return Err(AlsaVolumeError::UnexpectedPollError); } -- cgit v1.2.3