diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-05-22 13:35:33 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-05-22 13:35:33 -0400 |
commit | cde5c9d0c335e51c254251f018e9de620c27d9db (patch) | |
tree | 9fc9d257e215e8623b9118c925d54a69eb5915b8 /src | |
parent | b858f576c327f4fd0a2ead16dc6d6bf7b721829a (diff) | |
parent | a5d4ce2b393955f60962d3db8744a846506c3e7b (diff) | |
download | tor-cde5c9d0c335e51c254251f018e9de620c27d9db.tar.gz tor-cde5c9d0c335e51c254251f018e9de620c27d9db.zip |
Merge branch 'maint-0.3.3'
Diffstat (limited to 'src')
-rw-r--r-- | src/or/protover_rust.c | 17 | ||||
-rw-r--r-- | src/rust/protover/ffi.rs | 26 | ||||
-rw-r--r-- | src/test/test_protover.c | 2 |
3 files changed, 44 insertions, 1 deletions
diff --git a/src/or/protover_rust.c b/src/or/protover_rust.c index 26e21cc1c5..99304f8b51 100644 --- a/src/or/protover_rust.c +++ b/src/or/protover_rust.c @@ -13,7 +13,22 @@ #ifdef HAVE_RUST /* Define for compatibility, used in main.c */ -void protover_free_all(void) {} +void +protover_free_all(void) +{ +} + +int protover_contains_long_protocol_names_(const char *s); + +/** + * Return true if the unparsed protover in <b>s</b> would contain a protocol + * name longer than MAX_PROTOCOL_NAME_LENGTH, and false otherwise. + */ +bool +protover_contains_long_protocol_names(const char *s) +{ + return protover_contains_long_protocol_names_(s) != 0; +} #endif /* defined(HAVE_RUST) */ diff --git a/src/rust/protover/ffi.rs b/src/rust/protover/ffi.rs index 1e0d9d6bff..e3e545db75 100644 --- a/src/rust/protover/ffi.rs +++ b/src/rust/protover/ffi.rs @@ -113,6 +113,32 @@ pub extern "C" fn protocol_list_supports_protocol( } } +#[no_mangle] +pub extern "C" fn protover_contains_long_protocol_names_( + c_protocol_list: *const c_char +) -> c_int { + if c_protocol_list.is_null() { + return 1; + } + + // Require an unsafe block to read the version from a C string. The pointer + // is checked above to ensure it is not null. + let c_str: &CStr = unsafe { CStr::from_ptr(c_protocol_list) }; + + let protocol_list = match c_str.to_str() { + Ok(n) => n, + Err(_) => return 1 + }; + + let protocol_entry : Result<UnvalidatedProtoEntry,_> = + protocol_list.parse(); + + match protocol_entry { + Ok(_) => 0, + Err(_) => 1, + } +} + /// Provide an interface for C to translate arguments and return types for /// protover::list_supports_protocol_or_later #[no_mangle] diff --git a/src/test/test_protover.c b/src/test/test_protover.c index 1b0adb1757..70b7c9a85f 100644 --- a/src/test/test_protover.c +++ b/src/test/test_protover.c @@ -317,6 +317,7 @@ test_protover_all_supported(void *arg) tor_end_capture_bugs_(); /* Protocol name too long */ +#ifndef HAVE_RUST // XXXXXX ????? tor_capture_bugs_(1); tt_assert(protover_all_supported( "DoSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" @@ -324,6 +325,7 @@ test_protover_all_supported(void *arg) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaa=1-65536", &msg)); tor_end_capture_bugs_(); +#endif done: tor_end_capture_bugs_(); |