From 3dabda4b7dfa8a766a62650cc3390f148a4732ac Mon Sep 17 00:00:00 2001 From: Kevin Vu Date: Sat, 25 Oct 2025 17:01:46 -0700 Subject: [PATCH] fix: prevent NULL pointer crash in program_output on popen failure Signed-off-by: Kevin Vu --- userspace/falco/outputs_program.cpp | 14 +++++++++++++- userspace/falco/outputs_program.h | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/userspace/falco/outputs_program.cpp b/userspace/falco/outputs_program.cpp index b6b16124..811f94af 100644 --- a/userspace/falco/outputs_program.cpp +++ b/userspace/falco/outputs_program.cpp @@ -16,12 +16,22 @@ limitations under the License. */ #include "outputs_program.h" +#include "logger.h" #include +#include +#include void falco::outputs::output_program::open_pfile() { if(m_pfile == nullptr) { m_pfile = popen(m_oc.options["program"].c_str(), "w"); + if(m_pfile == nullptr) { + falco_logger::log(falco_logger::level::ERR, + "Failed to open program output: " + m_oc.options["program"] + + " (error: " + std::string(std::strerror(errno)) + ")"); + return; + } + if(!m_buffered) { setvbuf(m_pfile, NULL, _IONBF, 0); } @@ -31,7 +41,9 @@ void falco::outputs::output_program::open_pfile() { void falco::outputs::output_program::output(const message *msg) { open_pfile(); - fprintf(m_pfile, "%s\n", msg->msg.c_str()); + if(m_pfile != nullptr) { + fprintf(m_pfile, "%s\n", msg->msg.c_str()); + } if(m_oc.options["keep_alive"] != "true") { cleanup(); diff --git a/userspace/falco/outputs_program.h b/userspace/falco/outputs_program.h index 24c1eccd..9af7c37d 100644 --- a/userspace/falco/outputs_program.h +++ b/userspace/falco/outputs_program.h @@ -32,7 +32,7 @@ class output_program : public abstract_output { private: void open_pfile(); - FILE *m_pfile; + FILE *m_pfile = nullptr; }; } // namespace outputs