summaryrefslogtreecommitdiffstats
path: root/php-bug77653.patch
blob: 98fc4d136b3429c8a5f6e4d3c421b39d3690d8cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
From 06dd1d78a7ec1678b53ef657033c2021f4dc902f Mon Sep 17 00:00:00 2001
From: Jakub Zelenka <bukka@php.net>
Date: Sun, 31 Mar 2019 16:56:17 +0100
Subject: [PATCH 1/2] Fix logging in shutdown function

---
 sapi/fpm/fpm/fpm_stdio.c                  | 20 +++++++--
 sapi/fpm/tests/log-bm-in-shutdown-fn.phpt | 49 +++++++++++++++++++++++
 2 files changed, 65 insertions(+), 4 deletions(-)
 create mode 100644 sapi/fpm/tests/log-bm-in-shutdown-fn.phpt

diff --git a/sapi/fpm/fpm/fpm_stdio.c b/sapi/fpm/fpm/fpm_stdio.c
index 03d15cbf0d7c..75c4d8e9c262 100644
--- a/sapi/fpm/fpm/fpm_stdio.c
+++ b/sapi/fpm/fpm/fpm_stdio.c
@@ -106,9 +106,11 @@ int fpm_stdio_init_child(struct fpm_worker_pool_s *wp) /* {{{ */
 }
 /* }}} */
 
+#define FPM_STDIO_CMD_FLUSH "\0fscf"
+
 int fpm_stdio_flush_child() /* {{{ */
 {
-	return write(STDERR_FILENO, "\0", 1);
+	return write(STDERR_FILENO, FPM_STDIO_CMD_FLUSH, sizeof(FPM_STDIO_CMD_FLUSH));
 }
 /* }}} */
 
@@ -162,10 +164,20 @@ static void fpm_stdio_child_said(struct fpm_event_s *ev, short which, void *arg)
 				}
 			} else {
 				in_buf += res;
-				/* if buffer ends with \0, then the stream will be finished */
-				if (!buf[in_buf - 1]) {
+				/* check if buffer should be flushed */
+				if (!buf[in_buf - 1] && in_buf >= sizeof(FPM_STDIO_CMD_FLUSH) &&
+						!memcmp(buf + in_buf - sizeof(FPM_STDIO_CMD_FLUSH),
+							FPM_STDIO_CMD_FLUSH, sizeof(FPM_STDIO_CMD_FLUSH))) {
+					/* if buffer ends with flush cmd, then the stream will be finished */
+					finish_log_stream = 1;
+					in_buf -= sizeof(FPM_STDIO_CMD_FLUSH);
+				} else if (!buf[0] && in_buf > sizeof(FPM_STDIO_CMD_FLUSH) &&
+						!memcmp(buf, FPM_STDIO_CMD_FLUSH, sizeof(FPM_STDIO_CMD_FLUSH))) {
+					/* if buffer starts with flush cmd, then the stream will be finished */
 					finish_log_stream = 1;
-					in_buf--;
+					in_buf -= sizeof(FPM_STDIO_CMD_FLUSH);
+					/* move data behind the flush cmd */
+					memmove(buf, buf + sizeof(FPM_STDIO_CMD_FLUSH), in_buf);
 				}
 			}
 		}
diff --git a/sapi/fpm/tests/log-bm-in-shutdown-fn.phpt b/sapi/fpm/tests/log-bm-in-shutdown-fn.phpt
new file mode 100644
index 000000000000..f968bf9f08bc
--- /dev/null
+++ b/sapi/fpm/tests/log-bm-in-shutdown-fn.phpt
@@ -0,0 +1,49 @@
+--TEST--
+FPM: Log message in shutdown function
+--SKIPIF--
+<?php include "skipif.inc"; ?>
+--FILE--
+<?php
+
+require_once "tester.inc";
+
+$cfg = <<<EOT
+[global]
+error_log = {{FILE:LOG}}
+log_limit = 1024
+log_buffering = yes
+[unconfined]
+listen = {{ADDR}}
+pm = dynamic
+pm.max_children = 5
+pm.start_servers = 1
+pm.min_spare_servers = 1
+pm.max_spare_servers = 3
+catch_workers_output = yes
+EOT;
+
+$code = <<<EOT
+<?php
+register_shutdown_function(function() {
+    error_log(str_repeat('e', 80));
+});
+EOT;
+
+$tester = new FPM\Tester($cfg, $code);
+$tester->start();
+$tester->expectLogStartNotices();
+$tester->request()->expectEmptyBody();
+$tester->terminate();
+$tester->expectFastCGIErrorMessage('e', 1050, 80);
+$tester->expectLogMessage('NOTICE: PHP message: ' . str_repeat('e', 80), 1050);
+$tester->close();
+
+?>
+Done
+--EXPECT--
+Done
+--CLEAN--
+<?php
+require_once "tester.inc";
+FPM\Tester::clean();
+?>

From 72c010309bb0a7bb032677ca599424ceb2ad4883 Mon Sep 17 00:00:00 2001
From: Jakub Zelenka <bukka@php.net>
Date: Sun, 31 Mar 2019 17:55:29 +0100
Subject: [PATCH 2/2] Move stdio flush behind request shutdown

---
 sapi/fpm/fpm/fpm_main.c    | 3 +++
 sapi/fpm/fpm/fpm_request.c | 2 --
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c
index 483fabe9d850..bfd82a1c2e11 100644
--- a/sapi/fpm/fpm/fpm_main.c
+++ b/sapi/fpm/fpm/fpm_main.c
@@ -90,6 +90,7 @@ int __riscosify_control = __RISCOSIFY_STRICT_UNIX_SPECS;
 #include "fpm.h"
 #include "fpm_request.h"
 #include "fpm_status.h"
+#include "fpm_stdio.h"
 #include "fpm_conf.h"
 #include "fpm_php.h"
 #include "fpm_log.h"
@@ -1977,6 +1978,8 @@ consult the installation file that came with this distribution, or visit \n\
 
 			php_request_shutdown((void *) 0);
 
+			fpm_stdio_flush_child();
+
 			requests++;
 			if (UNEXPECTED(max_requests && (requests == max_requests))) {
 				fcgi_request_set_keep(request, 0);
diff --git a/sapi/fpm/fpm/fpm_request.c b/sapi/fpm/fpm/fpm_request.c
index 65f9c4ae441c..2aa503891ed9 100644
--- a/sapi/fpm/fpm/fpm_request.c
+++ b/sapi/fpm/fpm/fpm_request.c
@@ -16,7 +16,6 @@
 #include "fpm_children.h"
 #include "fpm_scoreboard.h"
 #include "fpm_status.h"
-#include "fpm_stdio.h"
 #include "fpm_request.h"
 #include "fpm_log.h"
 
@@ -200,7 +199,6 @@ void fpm_request_end(void) /* {{{ */
 #endif
 	proc->memory = memory;
 	fpm_scoreboard_proc_release(proc);
-	fpm_stdio_flush_child();
 }
 /* }}} */