Skip to content

Commit 9f400b4

Browse files
mikemiles-devMichael Mileusnich
and
Michael Mileusnich
authored
Infinite loop issue (#33)
* Infinite loop issue * fix --------- Co-authored-by: Michael Mileusnich <[email protected]>
1 parent afc49a4 commit 9f400b4

File tree

6 files changed

+59
-1
lines changed

6 files changed

+59
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "netflow_parser"
33
description = "Parser for Netflow Cisco V5, V7, V9, IPFIX"
4-
version = "0.2.0"
4+
version = "0.2.1"
55
edition = "2021"
66
77
license = "MIT OR Apache-2.0"

RELEASES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# 0.2.1
2+
* Fixed issue where no ipfix template fields can infinite loop.
3+
14
# 0.2.0
25
* Clippy updates for 1.76
36
* Removed dbg! macros for now for performance reason until we have a better solution.

SECURITY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
| Version | Supported |
66
| ------- | ------------------ |
7+
| 0.2.1 | :white_check_mark: |
78
| 0.2.0 | :white_check_mark: |
89
| 0.1.9 | :white_check_mark: |
910
| 0.1.8 | :white_check_mark: |

src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,21 @@ mod tests {
408408
assert_yaml_snapshot!(parser.parse_bytes(&packet));
409409
}
410410

411+
#[test]
412+
fn it_parses_ipfix_with_no_template_fields_raises_error() {
413+
let packet = [
414+
0, 10, 0, 26, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2, 0, 10, 0, 8, 0, 0, 1, 1,
415+
];
416+
let template = IPFixTemplate {
417+
field_count: 2,
418+
template_id: 258,
419+
fields: vec![],
420+
};
421+
let mut parser = NetflowParser::default();
422+
parser.ipfix_parser.templates.insert(258, template);
423+
assert_yaml_snapshot!(parser.parse_bytes(&packet));
424+
}
425+
411426
#[test]
412427
fn it_parses_ipfix_options_template() {
413428
let packet = [
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
source: src/lib.rs
3+
expression: parser.parse_bytes(&packet)
4+
---
5+
- Error:
6+
error_message: "Could not parse v10_set: Parsing Error: Error { input: [0, 8, 0, 0, 1, 1], code: Fail }"
7+
bytes:
8+
- 0
9+
- 10
10+
- 0
11+
- 26
12+
- 0
13+
- 0
14+
- 0
15+
- 1
16+
- 0
17+
- 0
18+
- 0
19+
- 1
20+
- 0
21+
- 0
22+
- 0
23+
- 0
24+
- 1
25+
- 2
26+
- 0
27+
- 10
28+
- 0
29+
- 8
30+
- 0
31+
- 0
32+
- 1
33+
- 1
34+

src/variable_versions/ipfix.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ fn parse_fields<T: CommonTemplateFields>(
220220
return Err(NomErr::Error(NomError::new(i, ErrorKind::Fail)));
221221
}
222222
};
223+
// If no fields there are no fields to parse
224+
if template.get_fields().is_empty() {
225+
// dbg!("Template without fields!");
226+
return Err(NomErr::Error(NomError::new(i, ErrorKind::Fail)));
227+
};
223228
let mut fields = vec![];
224229
let mut remaining = i;
225230
while !remaining.is_empty() {

0 commit comments

Comments
 (0)