@@ -438,9 +438,15 @@ impl DnstapParser {
438
438
439
439
if let Some ( query_address) = dnstap_message. query_address . as_ref ( ) {
440
440
let source_address = if socket_family == 1 {
441
+ if query_address. len ( ) < 4 {
442
+ return Err ( Error :: from ( "Cannot parse query_address" ) ) ;
443
+ }
441
444
let address_buffer: [ u8 ; 4 ] = query_address[ 0 ..4 ] . try_into ( ) ?;
442
445
IpAddr :: V4 ( Ipv4Addr :: from ( address_buffer) )
443
446
} else {
447
+ if query_address. len ( ) < 16 {
448
+ return Err ( Error :: from ( "Cannot parse query_address" ) ) ;
449
+ }
444
450
let address_buffer: [ u8 ; 16 ] = query_address[ 0 ..16 ] . try_into ( ) ?;
445
451
IpAddr :: V6 ( Ipv6Addr :: from ( address_buffer) )
446
452
} ;
@@ -464,9 +470,15 @@ impl DnstapParser {
464
470
465
471
if let Some ( response_address) = dnstap_message. response_address . as_ref ( ) {
466
472
let response_addr = if socket_family == 1 {
473
+ if response_address. len ( ) < 4 {
474
+ return Err ( Error :: from ( "Cannot parse response_address" ) ) ;
475
+ }
467
476
let address_buffer: [ u8 ; 4 ] = response_address[ 0 ..4 ] . try_into ( ) ?;
468
477
IpAddr :: V4 ( Ipv4Addr :: from ( address_buffer) )
469
478
} else {
479
+ if response_address. len ( ) < 16 {
480
+ return Err ( Error :: from ( "Cannot parse response_address" ) ) ;
481
+ }
470
482
let address_buffer: [ u8 ; 16 ] = response_address[ 0 ..16 ] . try_into ( ) ?;
471
483
IpAddr :: V6 ( Ipv6Addr :: from ( address_buffer) )
472
484
} ;
@@ -1038,7 +1050,7 @@ mod tests {
1038
1050
use super :: * ;
1039
1051
use chrono:: DateTime ;
1040
1052
use dnsmsg_parser:: dns_message_parser:: DnsParserOptions ;
1041
- use std:: collections:: BTreeMap ;
1053
+ use std:: { collections:: BTreeMap , vec } ;
1042
1054
1043
1055
#[ test]
1044
1056
fn test_parse_dnstap_data_with_query_message ( ) {
@@ -1365,6 +1377,46 @@ mod tests {
1365
1377
)
1366
1378
}
1367
1379
1380
+ #[ test]
1381
+ fn test_parse_dnstap_message_socket_family_bad_addr ( ) {
1382
+ // while parsing address is optional, but in this function assume otherwise
1383
+ fn test_one_input ( socket_family : i32 , msg : DnstapMessage ) -> Result < ( ) > {
1384
+ let mut event = LogEvent :: default ( ) ;
1385
+ let root = owned_value_path ! ( ) ;
1386
+ DnstapParser :: parse_dnstap_message_socket_family ( & mut event, & root, socket_family, & msg)
1387
+ }
1388
+ // all bad cases which can panic
1389
+ {
1390
+ let message = DnstapMessage {
1391
+ query_address : Some ( vec ! [ ] ) ,
1392
+ ..Default :: default ( )
1393
+ } ;
1394
+ assert ! ( test_one_input( 1 , message) . is_err( ) ) ;
1395
+ }
1396
+ {
1397
+ let message = DnstapMessage {
1398
+ query_address : Some ( vec ! [ ] ) ,
1399
+ ..Default :: default ( )
1400
+ } ;
1401
+ assert ! ( test_one_input( 2 , message) . is_err( ) ) ;
1402
+ }
1403
+
1404
+ {
1405
+ let message = DnstapMessage {
1406
+ response_address : Some ( vec ! [ ] ) ,
1407
+ ..Default :: default ( )
1408
+ } ;
1409
+ assert ! ( test_one_input( 1 , message) . is_err( ) ) ;
1410
+ }
1411
+ {
1412
+ let message = DnstapMessage {
1413
+ response_address : Some ( vec ! [ ] ) ,
1414
+ ..Default :: default ( )
1415
+ } ;
1416
+ assert ! ( test_one_input( 2 , message) . is_err( ) ) ;
1417
+ }
1418
+ }
1419
+
1368
1420
#[ test]
1369
1421
fn test_get_socket_family_name ( ) {
1370
1422
assert_eq ! ( "INET" , to_socket_family_name( 1 ) . unwrap( ) ) ;
0 commit comments