From 3ac6971a36ecad0ae24702b1a7af146503c8d736 Mon Sep 17 00:00:00 2001 From: DanyLE Date: Wed, 1 Feb 2023 16:41:09 +0100 Subject: [PATCH] fix: limut stdout record to 2048bytes to prevent header length overflow --- Cargo.toml | 2 +- src/lib.rs | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 72d1392..f4a61c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ rand = "0.8.5" twoway = "0.2.2" [profile.release] -opt-level = 's' +opt-level = 3 # 's' for size lto = true # panic = 'abort' diff --git a/src/lib.rs b/src/lib.rs index 87d57e4..14d0ccf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use rand::Rng; use std::collections::HashMap; use std::ffi::CString; use std::fmt::Arguments; -use std::io::{BufRead, BufReader, Error, ErrorKind, Read, Write}; +use std::io::{BufRead, BufReader, Cursor, Error, ErrorKind, Read, Write}; use std::os::fd::RawFd; use std::os::unix::io::AsRawFd; use std::time::SystemTime; @@ -724,7 +724,18 @@ impl FCGIOStream { } fn write_record(&mut self, buf: Vec) -> Result<(), std::io::Error> { - fcgi_send_stdout(self, self.id, Some(buf))?; + let mut buf_reader = BufReader::with_capacity(2048, Cursor::new(buf)); + loop { + let length = { + let buffer = buf_reader.fill_buf()?; + fcgi_send_stdout(self, self.id, Some(buffer.to_vec()))?; + buffer.len() + }; + if length == 0 { + break; + } + buf_reader.consume(length); + } Ok(()) } }