rust: Implement error types for Rust protover implementation.

This will allow us to do actual error handling intra-crate in a more
rusty manner, e.g. propogating errors in match statements, conversion
between error types, logging messages, etc.

 * FIXES part of #24031: https://bugs.torproject.org/24031.
This commit is contained in:
Isis Lovecruft 2018-03-21 00:24:46 +00:00
parent 3df9545492
commit b6059297d7
No known key found for this signature in database
GPG Key ID: B8938BC5E86C046F
3 changed files with 50 additions and 2 deletions

View File

@ -0,0 +1,43 @@
// Copyright (c) 2018, The Tor Project, Inc.
// Copyright (c) 2018, isis agora lovecruft
// See LICENSE for licensing information
//! Various errors which may occur during protocol version parsing.
use std::fmt;
use std::fmt::Display;
/// All errors which may occur during protover parsing routines.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
#[allow(missing_docs)] // See Display impl for error descriptions
pub enum ProtoverError {
Overlap,
LowGreaterThanHigh,
Unparseable,
ExceedsMax,
ExceedsExpansionLimit,
UnknownProtocol,
ExceedsNameLimit,
}
/// Descriptive error messages for `ProtoverError` variants.
impl Display for ProtoverError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ProtoverError::Overlap
=> write!(f, "Two or more (low, high) protover ranges would overlap once expanded."),
ProtoverError::LowGreaterThanHigh
=> write!(f, "The low in a (low, high) protover range was greater than high."),
ProtoverError::Unparseable
=> write!(f, "The protover string was unparseable."),
ProtoverError::ExceedsMax
=> write!(f, "The high in a (low, high) protover range exceeds u32::MAX."),
ProtoverError::ExceedsExpansionLimit
=> write!(f, "The protover string would exceed the maximum expansion limit."),
ProtoverError::UnknownProtocol
=> write!(f, "A protocol in the protover string we attempted to parse is unknown."),
ProtoverError::ExceedsNameLimit
=> write!(f, "An unrecognised protocol name was too long."),
}
}
}

View File

@ -22,6 +22,8 @@
//! protocols to develop independently, without having to claim compatibility //! protocols to develop independently, without having to claim compatibility
//! with specific versions of Tor. //! with specific versions of Tor.
#[deny(missing_docs)]
extern crate libc; extern crate libc;
extern crate smartlist; extern crate smartlist;
extern crate external; extern crate external;
@ -32,6 +34,7 @@ extern crate tor_util;
#[macro_use] #[macro_use]
extern crate tor_log; extern crate tor_log;
pub mod errors;
mod protover; mod protover;
pub mod ffi; pub mod ffi;

View File

@ -13,6 +13,8 @@ use std::u32;
use tor_log::{LogSeverity, LogDomain}; use tor_log::{LogSeverity, LogDomain};
use external::c_tor_version_as_new_as; use external::c_tor_version_as_new_as;
use errors::ProtoverError;
/// The first version of Tor that included "proto" entries in its descriptors. /// The first version of Tor that included "proto" entries in its descriptors.
/// Authorities should use this to decide whether to guess proto lines. /// Authorities should use this to decide whether to guess proto lines.
/// ///
@ -54,7 +56,7 @@ impl fmt::Display for Proto {
/// ///
/// C_RUST_COUPLED: src/or/protover.c `PROTOCOL_NAMES` /// C_RUST_COUPLED: src/or/protover.c `PROTOCOL_NAMES`
impl FromStr for Proto { impl FromStr for Proto {
type Err = &'static str; type Err = ProtoverError;
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
match s { match s {
@ -68,7 +70,7 @@ impl FromStr for Proto {
"LinkAuth" => Ok(Proto::LinkAuth), "LinkAuth" => Ok(Proto::LinkAuth),
"Microdesc" => Ok(Proto::Microdesc), "Microdesc" => Ok(Proto::Microdesc),
"Relay" => Ok(Proto::Relay), "Relay" => Ok(Proto::Relay),
_ => Err("Not a valid protocol type"), _ => Err(ProtoverError::UnknownProtocol),
} }
} }
} }