Make the TROVE-2018-005 fix work with rust.

This commit is contained in:
Nick Mathewson 2018-05-22 13:35:20 -04:00
parent 6e8e005b53
commit a5d4ce2b39
3 changed files with 44 additions and 1 deletions

View File

@ -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) */

View File

@ -116,6 +116,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]

View File

@ -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_();