summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-05-22 13:35:33 -0400
committerNick Mathewson <nickm@torproject.org>2018-05-22 13:35:33 -0400
commit0256702362b76345401156fa5258b686b53fe28e (patch)
tree2ff610928d6f0060dcbd47115f5d3c3453d72633
parent20f8fead9c27c0de7a5913f53294e960b029749b (diff)
parenta5d4ce2b393955f60962d3db8744a846506c3e7b (diff)
downloadtor-0256702362b76345401156fa5258b686b53fe28e.tar.gz
tor-0256702362b76345401156fa5258b686b53fe28e.zip
Merge branch 'maint-0.3.3' into release-0.3.3
-rw-r--r--src/or/protover_rust.c17
-rw-r--r--src/rust/protover/ffi.rs26
-rw-r--r--src/test/test_protover.c2
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 ed078654f7..9656e8c318 100644
--- a/src/rust/protover/ffi.rs
+++ b/src/rust/protover/ffi.rs
@@ -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]
diff --git a/src/test/test_protover.c b/src/test/test_protover.c
index a7d4667dfc..0948cd5640 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_();