Skip to content

Commit 9cbae4e

Browse files
committed
(wip) rust/jsonbuilder: make "new" fallible
Convert "new_object" and "new_array" functions that return a Result and use "try_reserve" to allocate the amount of data requested. This should allow memory allocation errors to be detected and handled in a Rust-ful matter without resorting to catching a panic.
1 parent 66bd9c1 commit 9cbae4e

File tree

3 files changed

+100
-60
lines changed

3 files changed

+100
-60
lines changed

rust/src/dns/log.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ pub fn dns_print_addr(addr: &Vec<u8>) -> std::string::String {
399399

400400
/// Log SOA section fields.
401401
fn dns_log_soa(soa: &DNSRDataSOA) -> Result<JsonBuilder, JsonError> {
402-
let mut js = JsonBuilder::new_object();
402+
let mut js = JsonBuilder::try_new_object()?;
403403

404404
js.set_string_from_bytes("mname", &soa.mname)?;
405405
js.set_string_from_bytes("rname", &soa.rname)?;
@@ -415,7 +415,7 @@ fn dns_log_soa(soa: &DNSRDataSOA) -> Result<JsonBuilder, JsonError> {
415415

416416
/// Log SSHFP section fields.
417417
fn dns_log_sshfp(sshfp: &DNSRDataSSHFP) -> Result<JsonBuilder, JsonError> {
418-
let mut js = JsonBuilder::new_object();
418+
let mut js = JsonBuilder::try_new_object()?;
419419

420420
let mut hex = Vec::new();
421421
for byte in &sshfp.fingerprint {
@@ -432,7 +432,7 @@ fn dns_log_sshfp(sshfp: &DNSRDataSSHFP) -> Result<JsonBuilder, JsonError> {
432432

433433
/// Log SRV section fields.
434434
fn dns_log_srv(srv: &DNSRDataSRV) -> Result<JsonBuilder, JsonError> {
435-
let mut js = JsonBuilder::new_object();
435+
let mut js = JsonBuilder::try_new_object()?;
436436

437437
js.set_uint("priority", srv.priority as u64)?;
438438
js.set_uint("weight", srv.weight as u64)?;
@@ -444,7 +444,7 @@ fn dns_log_srv(srv: &DNSRDataSRV) -> Result<JsonBuilder, JsonError> {
444444
}
445445

446446
fn dns_log_json_answer_detail(answer: &DNSAnswerEntry) -> Result<JsonBuilder, JsonError> {
447-
let mut jsa = JsonBuilder::new_object();
447+
let mut jsa = JsonBuilder::try_new_object()?;
448448

449449
jsa.set_string_from_bytes("rrname", &answer.name)?;
450450
jsa.set_string("rrtype", &dns_rrtype_string(answer.rrtype))?;
@@ -516,7 +516,7 @@ fn dns_log_json_answer(
516516
js.set_string("rcode", &dns_rcode_string(header.flags))?;
517517

518518
if !response.answers.is_empty() {
519-
let mut js_answers = JsonBuilder::new_array();
519+
let mut js_answers = JsonBuilder::try_new_array()?;
520520

521521
// For grouped answers we use a HashMap keyed by the rrtype.
522522
let mut answer_types = HashMap::new();
@@ -527,7 +527,7 @@ fn dns_log_json_answer(
527527
match &answer.data {
528528
DNSRData::A(addr) | DNSRData::AAAA(addr) => {
529529
if !answer_types.contains_key(&type_string) {
530-
answer_types.insert(type_string.to_string(), JsonBuilder::new_array());
530+
answer_types.insert(type_string.to_string(), JsonBuilder::try_new_array()?);
531531
}
532532
if let Some(a) = answer_types.get_mut(&type_string) {
533533
a.append_string(&dns_print_addr(addr))?;
@@ -540,31 +540,31 @@ fn dns_log_json_answer(
540540
| DNSRData::NULL(bytes)
541541
| DNSRData::PTR(bytes) => {
542542
if !answer_types.contains_key(&type_string) {
543-
answer_types.insert(type_string.to_string(), JsonBuilder::new_array());
543+
answer_types.insert(type_string.to_string(), JsonBuilder::try_new_array()?);
544544
}
545545
if let Some(a) = answer_types.get_mut(&type_string) {
546546
a.append_string_from_bytes(bytes)?;
547547
}
548548
}
549549
DNSRData::SOA(soa) => {
550550
if !answer_types.contains_key(&type_string) {
551-
answer_types.insert(type_string.to_string(), JsonBuilder::new_array());
551+
answer_types.insert(type_string.to_string(), JsonBuilder::try_new_array()?);
552552
}
553553
if let Some(a) = answer_types.get_mut(&type_string) {
554554
a.append_object(&dns_log_soa(soa)?)?;
555555
}
556556
}
557557
DNSRData::SSHFP(sshfp) => {
558558
if !answer_types.contains_key(&type_string) {
559-
answer_types.insert(type_string.to_string(), JsonBuilder::new_array());
559+
answer_types.insert(type_string.to_string(), JsonBuilder::try_new_array()?);
560560
}
561561
if let Some(a) = answer_types.get_mut(&type_string) {
562562
a.append_object(&dns_log_sshfp(sshfp)?)?;
563563
}
564564
}
565565
DNSRData::SRV(srv) => {
566566
if !answer_types.contains_key(&type_string) {
567-
answer_types.insert(type_string.to_string(), JsonBuilder::new_array());
567+
answer_types.insert(type_string.to_string(), JsonBuilder::try_new_array()?);
568568
}
569569
if let Some(a) = answer_types.get_mut(&type_string) {
570570
a.append_object(&dns_log_srv(srv)?)?;

0 commit comments

Comments
 (0)