From 2aea0e8fe6eda38d3123b33048cd9752ff2d8221 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 21 Apr 2018 17:46:29 +0200 Subject: [PATCH 1/2] do not panic on connection reset --- connect/src/spirc.rs | 4 ++++ core/src/session.rs | 26 ++++++++++++++++++++++++-- playback/src/player.rs | 4 ++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/connect/src/spirc.rs b/connect/src/spirc.rs index 9d41271..6c766a4 100644 --- a/connect/src/spirc.rs +++ b/connect/src/spirc.rs @@ -301,6 +301,10 @@ impl Future for SpircTask { loop { let mut progress = false; + if self.session.is_invalid() { + return Ok(Async::Ready(())); + } + if !self.shutdown { match self.subscription.poll().unwrap() { Async::Ready(Some(frame)) => { diff --git a/core/src/session.rs b/core/src/session.rs index ad0bf27..335cf0e 100644 --- a/core/src/session.rs +++ b/core/src/session.rs @@ -20,6 +20,7 @@ use mercury::MercuryManager; struct SessionData { country: String, canonical_username: String, + invalid: bool, } struct SessionInternal { @@ -77,7 +78,9 @@ impl Session { reusable_credentials.username.clone(), ); - handle.spawn(task.map_err(|e| panic!(e))); + handle.spawn(task.map_err(|e| { + error!("{:?}", e); + })); session }); @@ -104,6 +107,7 @@ impl Session { data: RwLock::new(SessionData { country: String::new(), canonical_username: username, + invalid: false, }), tx_connection: sender_tx, @@ -212,6 +216,15 @@ impl Session { pub fn session_id(&self) -> usize { self.0.session_id } + + pub fn shutdown(&self) { + debug!("Invalidating session[{}]", self.0.session_id); + self.0.data.write().unwrap().invalid = true; + } + + pub fn is_invalid(&self) -> bool { + self.0.data.read().unwrap().invalid + } } #[derive(Clone)] @@ -240,6 +253,7 @@ where impl Future for DispatchTask where S: Stream, + ::Error: ::std::fmt::Debug, { type Item = (); type Error = S::Error; @@ -251,7 +265,15 @@ where }; loop { - let (cmd, data) = try_ready!(self.0.poll()).expect("connection closed"); + let (cmd, data) = match self.0.poll() { + Ok(Async::Ready(t)) => t, + Ok(Async::NotReady) => return Ok(Async::NotReady), + Err(e) => { + session.shutdown(); + return Err(From::from(e)); + } + }.expect("connection closed"); + session.dispatch(cmd, data); } } diff --git a/playback/src/player.rs b/playback/src/player.rs index d803683..dd99423 100644 --- a/playback/src/player.rs +++ b/playback/src/player.rs @@ -341,6 +341,10 @@ impl PlayerInternal { self.handle_packet(packet, current_normalisation_factor); } } + + if self.session.is_invalid() { + return; + } } } From ab70e6ec4008379dc86a6ba7af833b96a917b19b Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Wed, 25 Apr 2018 19:29:50 +0200 Subject: [PATCH 2/2] run rustfmt --all --- audio/src/decrypt.rs | 2 +- audio/src/fetch.rs | 2 +- audio/src/lewton_decoder.rs | 2 +- playback/src/mixer/softmixer.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/audio/src/decrypt.rs b/audio/src/decrypt.rs index 85ba725..3b2967d 100644 --- a/audio/src/decrypt.rs +++ b/audio/src/decrypt.rs @@ -8,7 +8,7 @@ use std::ops::Add; use core::audio_key::AudioKey; const AUDIO_AESIV: &'static [u8] = &[ - 0x72, 0xe0, 0x67, 0xfb, 0xdd, 0xcb, 0xcf, 0x77, 0xeb, 0xe8, 0xbc, 0x64, 0x3f, 0x63, 0x0d, 0x93 + 0x72, 0xe0, 0x67, 0xfb, 0xdd, 0xcb, 0xcf, 0x77, 0xeb, 0xe8, 0xbc, 0x64, 0x3f, 0x63, 0x0d, 0x93, ]; pub struct AudioDecrypt { diff --git a/audio/src/fetch.rs b/audio/src/fetch.rs index 968e190..e5e461a 100644 --- a/audio/src/fetch.rs +++ b/audio/src/fetch.rs @@ -1,7 +1,7 @@ use bit_set::BitSet; use byteorder::{BigEndian, ByteOrder, WriteBytesExt}; -use futures::Stream; use futures::sync::{mpsc, oneshot}; +use futures::Stream; use futures::{Async, Future, Poll}; use std::cmp::min; use std::fs; diff --git a/audio/src/lewton_decoder.rs b/audio/src/lewton_decoder.rs index 97c2f35..982ed15 100644 --- a/audio/src/lewton_decoder.rs +++ b/audio/src/lewton_decoder.rs @@ -25,10 +25,10 @@ where } pub fn next_packet(&mut self) -> Result, VorbisError> { + use self::lewton::audio::AudioReadError::AudioIsHeader; use self::lewton::OggReadError::NoCapturePatternFound; use self::lewton::VorbisError::BadAudio; use self::lewton::VorbisError::OggError; - use self::lewton::audio::AudioReadError::AudioIsHeader; loop { match self.0.read_dec_packet_itl() { Ok(Some(packet)) => return Ok(Some(VorbisPacket(packet))), diff --git a/playback/src/mixer/softmixer.rs b/playback/src/mixer/softmixer.rs index 0210683..b197f09 100644 --- a/playback/src/mixer/softmixer.rs +++ b/playback/src/mixer/softmixer.rs @@ -1,5 +1,5 @@ -use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; use super::AudioFilter; use super::Mixer;