Adding d/p/10_check_http_chunked_wo_actual_content from upstream
This commit is contained in:
		
							parent
							
								
									c122ff0663
								
							
						
					
					
						commit
						01c9312d4b
					
				
					 2 changed files with 167 additions and 0 deletions
				
			
		
							
								
								
									
										166
									
								
								debian/patches/10_check_http_chunked_wo_actual_content
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								debian/patches/10_check_http_chunked_wo_actual_content
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,166 @@
 | 
				
			||||||
 | 
					From 6d3e44d2d8395076060e9c741e9b173dc5d57b76 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
 | 
				
			||||||
 | 
					Date: Mon, 6 Feb 2023 11:39:44 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 1/2] check_http: Handle chunked encoding without actual
 | 
				
			||||||
 | 
					 content correctly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 plugins/check_http.c | 8 +++++++-
 | 
				
			||||||
 | 
					 1 file changed, 7 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/plugins/check_http.c b/plugins/check_http.c
 | 
				
			||||||
 | 
					index 5fa310f5d..8dda046ff 100644
 | 
				
			||||||
 | 
					--- a/plugins/check_http.c
 | 
				
			||||||
 | 
					+++ b/plugins/check_http.c
 | 
				
			||||||
 | 
					@@ -1462,7 +1462,13 @@ char *unchunk_content(const char *content) {
 | 
				
			||||||
 | 
					     memcpy(result + (overall_size - size_of_chunk), start_of_chunk, size_of_chunk);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-  result[overall_size] = '\0';
 | 
				
			||||||
 | 
					+  if (overall_size == 0 && result == NULL) {
 | 
				
			||||||
 | 
					+    // We might just have received the end chunk without previous content, so result is never allocated
 | 
				
			||||||
 | 
					+    result = calloc(1, sizeof(char));
 | 
				
			||||||
 | 
					+    // No error handling here, we can only return NULL anyway
 | 
				
			||||||
 | 
					+  } else {
 | 
				
			||||||
 | 
					+    result[overall_size] = '\0';
 | 
				
			||||||
 | 
					+  }
 | 
				
			||||||
 | 
					   return result;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					From 03efbb8e4f736bf2df5d9477dd4191501fe035ea Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
 | 
				
			||||||
 | 
					Date: Mon, 6 Feb 2023 12:15:46 +0100
 | 
				
			||||||
 | 
					Subject: [PATCH 2/2] check_http: Implement special case test for zero size
 | 
				
			||||||
 | 
					 chunk only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 plugins/tests/check_http.t | 70 +++++++++++++++++++++++++++++++++++++-
 | 
				
			||||||
 | 
					 1 file changed, 69 insertions(+), 1 deletion(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t
 | 
				
			||||||
 | 
					index d766ac372..6078b2745 100755
 | 
				
			||||||
 | 
					--- a/plugins/tests/check_http.t
 | 
				
			||||||
 | 
					+++ b/plugins/tests/check_http.t
 | 
				
			||||||
 | 
					@@ -9,12 +9,14 @@ use strict;
 | 
				
			||||||
 | 
					 use Test::More;
 | 
				
			||||||
 | 
					 use NPTest;
 | 
				
			||||||
 | 
					 use FindBin qw($Bin);
 | 
				
			||||||
 | 
					+use IO::Socket::INET;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 $ENV{'LC_TIME'} = "C";
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 my $common_tests = 71;
 | 
				
			||||||
 | 
					 my $virtual_port_tests = 8;
 | 
				
			||||||
 | 
					 my $ssl_only_tests = 12;
 | 
				
			||||||
 | 
					+my $chunked_encoding_special_tests = 1;
 | 
				
			||||||
 | 
					 # Check that all dependent modules are available
 | 
				
			||||||
 | 
					 eval "use HTTP::Daemon 6.01;";
 | 
				
			||||||
 | 
					 plan skip_all => 'HTTP::Daemon >= 6.01 required' if $@;
 | 
				
			||||||
 | 
					@@ -30,7 +32,7 @@ if ($@) {
 | 
				
			||||||
 | 
					 	plan skip_all => "Missing required module for test: $@";
 | 
				
			||||||
 | 
					 } else {
 | 
				
			||||||
 | 
					 	if (-x "./$plugin") {
 | 
				
			||||||
 | 
					-		plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests;
 | 
				
			||||||
 | 
					+		plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests + $chunked_encoding_special_tests;
 | 
				
			||||||
 | 
					 	} else {
 | 
				
			||||||
 | 
					 		plan skip_all => "No $plugin compiled";
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					@@ -51,6 +53,7 @@ my $port_http = 50000 + int(rand(1000));
 | 
				
			||||||
 | 
					 my $port_https = $port_http + 1;
 | 
				
			||||||
 | 
					 my $port_https_expired = $port_http + 2;
 | 
				
			||||||
 | 
					 my $port_https_clientcert = $port_http + 3;
 | 
				
			||||||
 | 
					+my $port_hacked_http = $port_http + 4;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 # This array keeps sockets around for implementing timeouts
 | 
				
			||||||
 | 
					 my @persist;
 | 
				
			||||||
 | 
					@@ -72,6 +75,28 @@ if (!$pid) {
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 push @pids, $pid;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+# Fork the hacked HTTP server
 | 
				
			||||||
 | 
					+undef $pid;
 | 
				
			||||||
 | 
					+$pid = fork;
 | 
				
			||||||
 | 
					+defined $pid or die "Failed to fork";
 | 
				
			||||||
 | 
					+if (!$pid) {
 | 
				
			||||||
 | 
					+	# this is the fork
 | 
				
			||||||
 | 
					+	undef @pids;
 | 
				
			||||||
 | 
					+	my $socket = new IO::Socket::INET (
 | 
				
			||||||
 | 
					+		LocalHost => '0.0.0.0',
 | 
				
			||||||
 | 
					+		LocalPort => $port_hacked_http,
 | 
				
			||||||
 | 
					+		Proto => 'tcp',
 | 
				
			||||||
 | 
					+		Listen => 5,
 | 
				
			||||||
 | 
					+		Reuse => 1
 | 
				
			||||||
 | 
					+	);
 | 
				
			||||||
 | 
					+	die "cannot create socket $!n" unless $socket;
 | 
				
			||||||
 | 
					+	my $local_sock = $socket->sockport();
 | 
				
			||||||
 | 
					+	print "server waiting for client connection on port $local_sock\n";
 | 
				
			||||||
 | 
					+	run_hacked_http_server ( $socket );
 | 
				
			||||||
 | 
					+	die "hacked http server stopped";
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+push @pids, $pid;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 if (exists $servers->{https}) {
 | 
				
			||||||
 | 
					 	# Fork a normal HTTPS server
 | 
				
			||||||
 | 
					 	$pid = fork;
 | 
				
			||||||
 | 
					@@ -207,6 +232,37 @@ sub run_server {
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+sub run_hacked_http_server {
 | 
				
			||||||
 | 
					+	my $socket = shift;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	# auto-flush on socket
 | 
				
			||||||
 | 
					+	$| = 1;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	while(1)
 | 
				
			||||||
 | 
					+	{
 | 
				
			||||||
 | 
					+		# waiting for a new client connection
 | 
				
			||||||
 | 
					+		my $client_socket = $socket->accept();
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		# get information about a newly connected client
 | 
				
			||||||
 | 
					+		my $client_address = $client_socket->peerhost();
 | 
				
			||||||
 | 
					+		my $client_portn = $client_socket->peerport();
 | 
				
			||||||
 | 
					+		print "connection from $client_address:$client_portn";
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		# read up to 1024 characters from the connected client
 | 
				
			||||||
 | 
					+		my $data = "";
 | 
				
			||||||
 | 
					+		$client_socket->recv($data, 1024);
 | 
				
			||||||
 | 
					+		print "received data: $data";
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		# write response data to the connected client
 | 
				
			||||||
 | 
					+		$data = "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n";
 | 
				
			||||||
 | 
					+		$client_socket->send($data);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		# notify client that response has been sent
 | 
				
			||||||
 | 
					+		shutdown($client_socket, 1);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 END {
 | 
				
			||||||
 | 
					 	foreach my $pid (@pids) {
 | 
				
			||||||
 | 
					 		if ($pid) { print "Killing $pid\n"; kill "INT", $pid }
 | 
				
			||||||
 | 
					@@ -222,6 +278,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") {
 | 
				
			||||||
 | 
					 my $result;
 | 
				
			||||||
 | 
					 my $command = "./$plugin -H 127.0.0.1";
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+run_chunked_encoding_special_test( {command => "$command -p $port_hacked_http"});
 | 
				
			||||||
 | 
					 run_common_tests( { command => "$command -p $port_http" } );
 | 
				
			||||||
 | 
					 SKIP: {
 | 
				
			||||||
 | 
					 	skip "HTTP::Daemon::SSL not installed", $common_tests + $ssl_only_tests if ! exists $servers->{https};
 | 
				
			||||||
 | 
					@@ -511,3 +568,14 @@ sub run_common_tests {
 | 
				
			||||||
 | 
					 	};
 | 
				
			||||||
 | 
					 	is( $@, "", $cmd );
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+sub run_chunked_encoding_special_test {
 | 
				
			||||||
 | 
					+	my ($opts) = @_;
 | 
				
			||||||
 | 
					+	my $command = $opts->{command};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	$cmd = "$command -u / -s 'ChunkedEncodingSpecialTest'";
 | 
				
			||||||
 | 
					+	eval {
 | 
				
			||||||
 | 
					+		$result = NPTest->testCmd( $cmd, 5 );
 | 
				
			||||||
 | 
					+	};
 | 
				
			||||||
 | 
					+	is( $@, "", $cmd );
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
							
								
								
									
										1
									
								
								debian/patches/series
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/patches/series
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
02_check_icmp_links
 | 
					02_check_icmp_links
 | 
				
			||||||
03_epn
 | 
					03_epn
 | 
				
			||||||
# commited upstream
 | 
					# commited upstream
 | 
				
			||||||
 | 
					10_check_http_chunked_wo_actual_content
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue