From b4023f5281280acf15c7df90e08ac78c8aebe2d2 Mon Sep 17 00:00:00 2001 From: Ty Overby Date: Wed, 7 Jan 2015 10:18:39 -0800 Subject: [PATCH] Fix utf-8 handling when reading malformed messages. --- src/lib.rs | 1 - src/reader.rs | 7 ++++++- src/test.rs | 10 ++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d96929e..b7315a9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,6 @@ #![crate_type = "rlib"] #![crate_type = "dylib"] #![feature(old_orphan_check)] -#![feature(associated_types)] extern crate "rustc-serialize" as rustc_serialize; diff --git a/src/reader.rs b/src/reader.rs index 3a897ad..9ff116a 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,4 +1,5 @@ use std::io::{Buffer, Reader, IoError, IoResult, OtherIoError}; +use std::error::Error; use rustc_serialize::Decoder; @@ -72,7 +73,11 @@ impl<'a, R: Reader+Buffer> Decoder for DecoderReader<'a, R> { fn read_str(&mut self) -> IoResult { let len = try!(self.read_uint()); let vector = try!(self.reader.read_exact(len)); - Ok(String::from_utf8(vector).unwrap()) + String::from_utf8(vector).map_err(|e| IoError { + kind: OtherIoError, + desc: "invalid utf-8", + detail: e.detail() + }) } fn read_enum(&mut self, _: &str, f: F) -> IoResult where F: FnOnce(&mut DecoderReader<'a, R>) -> IoResult { diff --git a/src/test.rs b/src/test.rs index cc053ab..ff41263 100644 --- a/src/test.rs +++ b/src/test.rs @@ -165,3 +165,13 @@ fn unicode() { the_same("å".to_string()); the_same("aåååååååa".to_string()); } + +#[test] +fn bad_unicode() { + // This is a malformed message that contains bad utf8. + // The decoding should return Err but not panic. + let encoded = vec![0,0,0,0, 0,0,0,2, 97, 195]; + let decoded: Result = decode(encoded, Infinite); + + assert!(decoded.is_err()); +}