Skip to content

Commit 3590fe2

Browse files
committed
More failure removal
CC rust-postgres#43
1 parent 1134664 commit 3590fe2

2 files changed

Lines changed: 20 additions & 6 deletions

File tree

src/lib/error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ pub enum PostgresError {
544544
PgWrongTransaction,
545545
/// The server returned an unexpected response
546546
PgBadResponse,
547+
/// The server provided data that the client could not parse
548+
PgBadData,
547549
}
548550

549551
impl fmt::Show for PostgresError {
@@ -569,6 +571,9 @@ impl fmt::Show for PostgresError {
569571
active transaction"),
570572
PgBadResponse =>
571573
write!(fmt, "The server returned an unexpected response"),
574+
PgBadData =>
575+
write!(fmt, "The server provided data that the client could \
576+
not parse"),
572577
}
573578
}
574579
}

src/lib/types/mod.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use std::io::util::LimitReader;
1010
use time::Timespec;
1111

1212
use PostgresResult;
13-
use error::{PgWrongType, PgStreamError, PgWasNull};
13+
use error::{PgWrongType, PgStreamError, PgWasNull, PgBadData};
1414
use types::array::{Array, ArrayBase, DimensionInfo};
1515
use types::range::{RangeBound, Inclusive, Exclusive, Range};
1616

@@ -270,7 +270,7 @@ impl RawFromSql for Vec<u8> {
270270

271271
impl RawFromSql for String {
272272
fn raw_from_sql<R: Reader>(raw: &mut R) -> PostgresResult<String> {
273-
Ok(String::from_utf8(try_pg!(raw.read_to_end())).unwrap())
273+
String::from_utf8(try_pg!(raw.read_to_end())).map_err(|_| PgBadData)
274274
}
275275
}
276276

@@ -298,7 +298,10 @@ impl RawFromSql for Timespec {
298298

299299
impl RawFromSql for Uuid {
300300
fn raw_from_sql<R: Reader>(raw: &mut R) -> PostgresResult<Uuid> {
301-
Ok(Uuid::from_bytes(try_pg!(raw.read_to_end()).as_slice()).unwrap())
301+
match Uuid::from_bytes(try_pg!(raw.read_to_end()).as_slice()) {
302+
Some(u) => Ok(u),
303+
None => Err(PgBadData),
304+
}
302305
}
303306
}
304307

@@ -356,7 +359,7 @@ from_range_impl!(Timespec)
356359

357360
impl RawFromSql for Json {
358361
fn raw_from_sql<R: Reader>(raw: &mut R) -> PostgresResult<Json> {
359-
Ok(json::from_reader(raw as &mut Reader).unwrap())
362+
json::from_reader(raw).map_err(|_| PgBadData)
360363
}
361364
}
362365

@@ -484,14 +487,20 @@ impl FromSql for Option<HashMap<String, Option<String>>> {
484487
for _ in range(0, count) {
485488
let key_len = try_pg!(rdr.read_be_i32());
486489
let key = try_pg!(rdr.read_exact(key_len as uint));
487-
let key = String::from_utf8(key).unwrap();
490+
let key = match String::from_utf8(key) {
491+
Ok(key) => key,
492+
Err(_) => return Err(PgBadData),
493+
};
488494

489495
let val_len = try_pg!(rdr.read_be_i32());
490496
let val = if val_len < 0 {
491497
None
492498
} else {
493499
let val = try_pg!(rdr.read_exact(val_len as uint));
494-
Some(String::from_utf8(val).unwrap())
500+
match String::from_utf8(val) {
501+
Ok(val) => Some(val),
502+
Err(_) => return Err(PgBadData),
503+
}
495504
};
496505

497506
map.insert(key, val);

0 commit comments

Comments
 (0)