diff options
author | Andrew Yourtchenko <ayourtch@gmail.com> | 2019-09-11 14:14:43 +0000 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2019-09-23 12:42:38 +0000 |
commit | 4da1506d39eb8f67ed2c48c76916bb6bcca6fbf1 (patch) | |
tree | 10770efa0d803802cd074ea6014954c50625ff88 | |
parent | 1c887d9362f6c819e7fcf5b3bdecbeb386c9152b (diff) |
interface: use the correct condition for checking if the pcap fd is open
The 9af7e2e87e used a comparison that fd is >= 0 to check that
the pcap needs closing. While the pcap_close() function does
reset the file descriptor to -1, the freshly initialized structure
has it equal to 0.
This causes the VPP to close stdin if the packets are being seen
on pg interface without the capture file being opened.
This triggers the vpp attempting to read from STDIN
(another bug), which results in running out of memory.
Change-Id: I11d61422701500a9b3e0dd52d59383f297d57f54
Type: fix
Fixes: 9af7e2e87e
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
-rw-r--r-- | src/vlib/main.c | 2 | ||||
-rw-r--r-- | src/vnet/interface_cli.c | 2 | ||||
-rw-r--r-- | src/vnet/interface_output.c | 2 | ||||
-rw-r--r-- | src/vnet/pg/output.c | 2 |
4 files changed, 4 insertions, 4 deletions
diff --git a/src/vlib/main.c b/src/vlib/main.c index 2df935a5e17..f49790d28b5 100644 --- a/src/vlib/main.c +++ b/src/vlib/main.c @@ -2254,7 +2254,7 @@ vlib_pcap_dispatch_trace_configure (vlib_pcap_dispatch_trace_args_t * a) vlib_cli_output (vm, "Write %d packets to %s, and stop capture...", pm->n_packets_captured, pm->file_name); error = pcap_write (pm); - if (pm->file_descriptor >= 0) + if (pm->flags & PCAP_MAIN_INIT_DONE) pcap_close (pm); /* Report I/O errors... */ if (error) diff --git a/src/vnet/interface_cli.c b/src/vnet/interface_cli.c index 8f1fde7e852..3164f7a31f2 100644 --- a/src/vnet/interface_cli.c +++ b/src/vnet/interface_cli.c @@ -1776,7 +1776,7 @@ vnet_pcap_dispatch_trace_configure (vnet_pcap_dispatch_trace_args_t * a) vlib_cli_output (vm, "Write %d packets to %s, and stop capture...", pm->n_packets_captured, pm->file_name); error = pcap_write (pm); - if (pm->file_descriptor >= 0) + if (pm->flags & PCAP_MAIN_INIT_DONE) pcap_close (pm); /* Report I/O errors... */ if (error) diff --git a/src/vnet/interface_output.c b/src/vnet/interface_output.c index 1506db91ea9..721236a777f 100644 --- a/src/vnet/interface_output.c +++ b/src/vnet/interface_output.c @@ -1467,7 +1467,7 @@ pcap_drop_trace_command_fn (vlib_main_t * vm, im->pcap_main.n_packets_to_capture = im->pcap_main.n_packets_captured; error = pcap_write (&im->pcap_main); - if (im->pcap_main.file_descriptor >= 0) + if (im->pcap_main.flags & PCAP_MAIN_INIT_DONE) pcap_close (&im->pcap_main); if (error) clib_error_report (error); diff --git a/src/vnet/pg/output.c b/src/vnet/pg/output.c index b5ee157b4c6..d8059fab186 100644 --- a/src/vnet/pg/output.c +++ b/src/vnet/pg/output.c @@ -79,7 +79,7 @@ pg_output (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) } if (pif->pcap_file_name != 0) pcap_write (&pif->pcap_main); - if (pif->pcap_main.file_descriptor >= 0 + if ((pif->pcap_main.flags & PCAP_MAIN_INIT_DONE) && pif->pcap_main.n_packets_captured >= pif->pcap_main.n_packets_to_capture) pcap_close (&pif->pcap_main); |