passenger 6.0.18 → 6.0.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG +26 -2
- data/CONTRIBUTORS +2 -0
- data/build/test_basics.rb +6 -2
- data/dev/copy_boost_headers +77 -61
- data/src/agent/Core/Config.h +1 -1
- data/src/agent/Core/Controller/Config.h +1 -1
- data/src/agent/Core/SecurityUpdateChecker.h +4 -4
- data/src/agent/Watchdog/Config.h +1 -1
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/cxx_supportlib/vendor-modified/modp_b64_strict_aliasing.cpp +1 -1
- data/src/helper-scripts/wsgi-loader.py +34 -17
- data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +3 -1
- data/src/ruby_supportlib/phusion_passenger/ruby_core_enhancements.rb +5 -0
- data/src/ruby_supportlib/phusion_passenger.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4d6c6aa2e5aebe46db8eaac696afa9aab27bc8d54f50bd220e465ab42bcf3791
|
4
|
+
data.tar.gz: c57f1e7ba334127a9a8f17c5b7e9ed44758b38ecac0d50b0fa1cb4132382b4db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c778980e85efdc20b16d636607c4d1ec96684c523ce0a2e8d3a2b0199222412023b18c826bacb6744dedb9035fde1e82c3dc96fe9fdaa453c79c7b86c41746a
|
7
|
+
data.tar.gz: 1666e6ae1719c0ccf9a03e9ef05855054f433c7fe68b9c0fbc4b1485db313fc7d30ffe3d26fa6ee11b3420d6a1d85b4f4324cffcb5528512bcd9aaa1cb4cc220
|
data/CHANGELOG
CHANGED
@@ -1,6 +1,30 @@
|
|
1
|
-
Release 6.0.
|
1
|
+
Release 6.0.19 (Not yet released)
|
2
|
+
-------------
|
3
|
+
* [Ruby] Fix compatibility with Rack 3 header array. Closses GH-2503.
|
4
|
+
* [Ruby] Preserve `SIGPROF` signal handlers. Contributed by Ivo Anjo. Closes GH-2489.
|
5
|
+
* [Python] Replaces use of imp module with importlib in Python 3. Contributed by Rongxin Liu. Closes GH-2399 and GH-2501.
|
6
|
+
* [Ubuntu] Removes packages for Ubuntu 18.04 "Bionic" (EOL June 2023).
|
7
|
+
* [Ubuntu] Adds packages for Ubuntu 23.04 "mantic".
|
8
|
+
* Fixed a memory allocation bug in the security update checker.
|
9
|
+
* [Debian] Add Debian 12 Bookworm packages. Closes GH-2488.
|
10
|
+
* [RPM] Published arm64/aarch64 rpms for EL8 & EL9 (RHEL, Rocky, Alma). Closes GH-2452.
|
11
|
+
* [ARM] Publishes prebuilt arm64/aarch64 binaries for Passenger gem installs. Closes GH-2288.
|
12
|
+
* [ARM] Fixes a regression in Passenger 6.0.7 where strict-aliasing archs (notably: aarch64 aka ARM64) builds of Passenger were always building for big-endian archs. Closes GH-2451 and GH-2419.
|
13
|
+
* Updated various library versions used in precompiled binaries (used for e.g. gem installs):
|
14
|
+
- ccache: 4.6.3 -> 4.8.3
|
15
|
+
- cmake: 3.26.4 -> 3.27.7
|
16
|
+
- curl: 8.1.2 -> 8.4.0
|
17
|
+
- git: 2.41.0 -> 2.42.0
|
18
|
+
- gnupg: 2.4.2 -> 2.4.3
|
19
|
+
- libassuan: 2.5.5 -> 2.5.6
|
20
|
+
- libksba: 1.6.3 -> 1.6.4
|
21
|
+
- openssl: 3.1.1 -> 3.1.4
|
22
|
+
- rubygems: 3.4.13 -> 3.4.21
|
23
|
+
- zlib: 1.2.13 -> 1.3
|
24
|
+
|
25
|
+
|
26
|
+
Release 6.0.18
|
2
27
|
-------------
|
3
|
-
* Adds support for arm (aarch64) rpm packages.
|
4
28
|
* Adds Ubuntu 23.04 "Lunar" packages, removes Ubuntu 22.10 "Kinetic" packages.
|
5
29
|
* Removes packages for Debian 9 "Stretch" (EOL June 2022).
|
6
30
|
* [RPM] Changes to building Nginx module packages for the latest supported Nginx module stream instead of the default.
|
data/CONTRIBUTORS
CHANGED
@@ -48,6 +48,7 @@ Ian Kottman
|
|
48
48
|
Igor Vuk
|
49
49
|
isaac
|
50
50
|
Isaac Reuben
|
51
|
+
Ivo Anjo
|
51
52
|
J Smith
|
52
53
|
J.W. Koelewijn
|
53
54
|
Jacob Elder
|
@@ -105,6 +106,7 @@ Rob Paisley
|
|
105
106
|
Robin Bowes
|
106
107
|
Romain Tartière
|
107
108
|
ROMB
|
109
|
+
Rongxin Liu
|
108
110
|
Ruslan Ermilov (NGINX Inc)
|
109
111
|
Ryan Schwartz
|
110
112
|
Ryo Onodera
|
data/build/test_basics.rb
CHANGED
@@ -62,9 +62,13 @@ task 'test:install_deps' do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
if install_base_deps
|
65
|
-
|
65
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') || RUBY_PLATFORM =~ /darwin/
|
66
|
+
sh "bundle install #{bundle_args} --without="
|
67
|
+
else
|
68
|
+
sh "bundle install #{bundle_args} --without future"
|
69
|
+
end
|
66
70
|
else
|
67
|
-
sh "bundle install #{bundle_args} --without base"
|
71
|
+
sh "bundle install #{bundle_args} --without base future"
|
68
72
|
end
|
69
73
|
|
70
74
|
if boolean_option('NODE_MODULES', default)
|
data/dev/copy_boost_headers
CHANGED
@@ -24,56 +24,56 @@
|
|
24
24
|
# THE SOFTWARE.
|
25
25
|
|
26
26
|
ESSENTIALS = [
|
27
|
-
"boost
|
28
|
-
"boost/
|
29
|
-
"boost/
|
30
|
-
"boost/preprocessor/stringize.hpp",
|
31
|
-
"boost/smart_ptr/detail/sp_counted_*",
|
32
|
-
"boost/smart_ptr/detail/atomic_count*",
|
33
|
-
"boost/smart_ptr/detail/spinlock*",
|
27
|
+
"boost/*regex*",
|
28
|
+
"boost/algorithm/string",
|
29
|
+
"boost/asio*",
|
34
30
|
"boost/atomic",
|
35
|
-
"boost/
|
36
|
-
"boost/
|
37
|
-
"boost/
|
38
|
-
"boost/intrusive",
|
31
|
+
"boost/bind",
|
32
|
+
"boost/chrono*",
|
33
|
+
"boost/config*",
|
39
34
|
"boost/container",
|
40
|
-
"boost/predef",
|
41
|
-
"boost/move",
|
42
35
|
"boost/core",
|
43
|
-
"boost/
|
36
|
+
"boost/cstdint.hpp",
|
37
|
+
"boost/date_time",
|
38
|
+
"boost/date_time/date_formatting_limited.hpp",
|
39
|
+
"boost/date_time/gregorian/formatters_limited.hpp",
|
40
|
+
"boost/detail/fenv.hpp",
|
41
|
+
"boost/detail/reference_content.hpp",
|
42
|
+
"boost/foreach.hpp",
|
44
43
|
"boost/function",
|
45
|
-
"boost/ratio*",
|
46
44
|
"boost/integer*",
|
47
|
-
"boost/
|
48
|
-
"boost/
|
49
|
-
"boost/
|
50
|
-
"boost/
|
45
|
+
"boost/intrusive",
|
46
|
+
"boost/move",
|
47
|
+
"boost/mpl",
|
48
|
+
"boost/non_type.hpp",
|
49
|
+
"boost/none*",
|
51
50
|
"boost/optional",
|
52
|
-
"boost/
|
53
|
-
"libs/thread/src",
|
54
|
-
"libs/system/src",
|
55
|
-
"libs/regex/src",
|
56
|
-
"libs/chrono/src",
|
57
|
-
"libs/random/src",
|
58
|
-
"boost/preprocessor",
|
51
|
+
"boost/optional.hpp",
|
59
52
|
"boost/parameter",
|
60
|
-
"boost/
|
61
|
-
"boost/
|
62
|
-
"boost/
|
53
|
+
"boost/pool",
|
54
|
+
"boost/predef",
|
55
|
+
"boost/predef/other/endian.h",
|
56
|
+
"boost/preprocessor",
|
57
|
+
"boost/preprocessor/stringize.hpp",
|
58
|
+
"boost/random*",
|
59
|
+
"boost/ratio*",
|
60
|
+
"boost/smart_ptr/detail/atomic_count*",
|
61
|
+
"boost/smart_ptr/detail/sp_counted_*",
|
62
|
+
"boost/smart_ptr/detail/spinlock*",
|
63
|
+
"boost/system/config.hpp",
|
64
|
+
"boost/system/detail/error_code.ipp",
|
65
|
+
"boost/thread",
|
66
|
+
"boost/type_traits",
|
63
67
|
"boost/type_traits/detail/*",
|
68
|
+
"boost/type_traits/make_signed.hpp",
|
64
69
|
"boost/typeof",
|
65
|
-
"boost/
|
66
|
-
"boost/
|
67
|
-
"
|
68
|
-
"
|
69
|
-
"
|
70
|
-
"
|
71
|
-
"
|
72
|
-
"boost/none*",
|
73
|
-
"boost/system/detail/error_code.ipp",
|
74
|
-
"boost/system/config.hpp",
|
75
|
-
"boost/detail/reference_content.hpp",
|
76
|
-
"boost/algorithm/string"
|
70
|
+
"boost/unordered*",
|
71
|
+
"boost/utility",
|
72
|
+
"libs/chrono/src",
|
73
|
+
"libs/random/src",
|
74
|
+
"libs/regex/src",
|
75
|
+
"libs/system/src",
|
76
|
+
"libs/thread/src",
|
77
77
|
]
|
78
78
|
EXCLUDE = [
|
79
79
|
"libs/thread/src/win32/*",
|
@@ -87,43 +87,59 @@ EXCLUDE = [
|
|
87
87
|
"boost/asio/detail/impl/win*"
|
88
88
|
]
|
89
89
|
PROGRAM_SOURCE = %q{
|
90
|
-
#include <boost/
|
91
|
-
#include <boost/
|
92
|
-
#include <boost/
|
93
|
-
#include <boost/
|
94
|
-
#include <boost/enable_shared_from_this.hpp>
|
95
|
-
#include <boost/intrusive_ptr.hpp>
|
96
|
-
#include <boost/smart_ptr/intrusive_ref_counter.hpp>
|
97
|
-
#include <boost/thread.hpp>
|
98
|
-
#include <boost/noncopyable.hpp>
|
99
|
-
#include <boost/function.hpp>
|
100
|
-
#include <boost/bind/bind.hpp>
|
101
|
-
#include <boost/container/vector.hpp>
|
102
|
-
#include <boost/date_time/posix_time/posix_time.hpp>
|
103
|
-
#include <boost/foreach.hpp>
|
104
|
-
#include <boost/unordered_map.hpp>
|
105
|
-
#include <boost/regex.hpp>
|
106
|
-
#include <boost/pool/object_pool.hpp>
|
107
|
-
#include <boost/move/core.hpp>
|
108
|
-
#include <boost/move/utility.hpp>
|
90
|
+
#include <boost/aligned_storage.hpp>
|
91
|
+
#include <boost/asio.hpp>
|
92
|
+
#include <boost/asio/ssl.hpp>
|
93
|
+
#include <boost/asio/steady_timer.hpp>
|
109
94
|
#include <boost/atomic.hpp>
|
110
|
-
#include <boost/
|
95
|
+
#include <boost/bind/bind.hpp>
|
96
|
+
#include <boost/chrono.hpp>
|
111
97
|
#include <boost/circular_buffer.hpp>
|
112
98
|
#include <boost/config.hpp>
|
113
99
|
#include <boost/container/small_vector.hpp>
|
100
|
+
#include <boost/container/vector.hpp>
|
114
101
|
#include <boost/core/noncopyable.hpp>
|
115
102
|
#include <boost/cstdint.hpp>
|
116
103
|
#include <boost/current_function.hpp>
|
104
|
+
#include <boost/date_time/posix_time/posix_time.hpp>
|
117
105
|
#include <boost/date_time/posix_time/posix_time_types.hpp>
|
106
|
+
#include <boost/enable_shared_from_this.hpp>
|
107
|
+
#include <boost/foreach.hpp>
|
108
|
+
#include <boost/function.hpp>
|
109
|
+
#include <boost/intrusive_ptr.hpp>
|
110
|
+
#include <boost/make_shared.hpp>
|
111
|
+
#include <boost/move/core.hpp>
|
118
112
|
#include <boost/move/move.hpp>
|
113
|
+
#include <boost/move/utility.hpp>
|
114
|
+
#include <boost/noncopyable.hpp>
|
115
|
+
#include <boost/nondet_random.hpp>
|
116
|
+
#include <boost/pointer_cast.hpp>
|
117
|
+
#include <boost/pool/object_pool.hpp>
|
119
118
|
#include <boost/predef.h>
|
119
|
+
#include <boost/predef/other/endian.h>
|
120
|
+
#include <boost/random/random_device.hpp>
|
121
|
+
#include <boost/random/uniform_int_distribution.hpp>
|
120
122
|
#include <boost/ref.hpp>
|
123
|
+
#include <boost/regex.hpp>
|
121
124
|
#include <boost/scoped_array.hpp>
|
122
125
|
#include <boost/scoped_ptr.hpp>
|
126
|
+
#include <boost/shared_array.hpp>
|
127
|
+
#include <boost/shared_ptr.hpp>
|
128
|
+
#include <boost/smart_ptr/intrusive_ref_counter.hpp>
|
123
129
|
#include <boost/static_assert.hpp>
|
130
|
+
#include <boost/system/error_code.hpp>
|
131
|
+
#include <boost/system/system_error.hpp>
|
132
|
+
#include <boost/thread.hpp>
|
133
|
+
#include <boost/thread/condition_variable.hpp>
|
124
134
|
#include <boost/thread/mutex.hpp>
|
135
|
+
#include <boost/thread/once.hpp>
|
125
136
|
#include <boost/thread/tss.hpp>
|
137
|
+
#include <boost/typeof/typeof.hpp>
|
138
|
+
#include <boost/unordered_map.hpp>
|
139
|
+
#include <boost/version.hpp>
|
140
|
+
#include <boost/weak_ptr.hpp>
|
126
141
|
// Included despite not used in Passenger
|
142
|
+
#include <boost/thread/thread_time.hpp>
|
127
143
|
#include <boost/cregex.hpp>
|
128
144
|
#include <boost/pointer_cast.hpp>
|
129
145
|
#include <boost/asio.hpp>
|
data/src/agent/Core/Config.h
CHANGED
@@ -165,7 +165,7 @@ using namespace std;
|
|
165
165
|
* security_update_checker_interval unsigned integer - default(86400)
|
166
166
|
* security_update_checker_proxy_url string - -
|
167
167
|
* security_update_checker_url string - default("https://securitycheck.phusionpassenger.com/v1/check.json")
|
168
|
-
* server_software string - default("Phusion_Passenger/6.0.
|
168
|
+
* server_software string - default("Phusion_Passenger/6.0.19")
|
169
169
|
* show_version_in_header boolean - default(true)
|
170
170
|
* single_app_mode_app_root string - default,read_only
|
171
171
|
* single_app_mode_app_start_command string - read_only
|
@@ -116,7 +116,7 @@ parseControllerBenchmarkMode(const StaticString &mode) {
|
|
116
116
|
* multi_app boolean - default(true),read_only
|
117
117
|
* request_freelist_limit unsigned integer - default(1024)
|
118
118
|
* response_buffer_high_watermark unsigned integer - default(134217728)
|
119
|
-
* server_software string - default("Phusion_Passenger/6.0.
|
119
|
+
* server_software string - default("Phusion_Passenger/6.0.19")
|
120
120
|
* show_version_in_header boolean - default(true)
|
121
121
|
* start_reading_after_accept boolean - default(true)
|
122
122
|
* stat_throttle_rate unsigned integer - default(10)
|
@@ -322,7 +322,7 @@ private:
|
|
322
322
|
error.append("url not found: " + sessionState.configRlz.url + " " POSSIBLE_MITM_RESOLUTION);
|
323
323
|
break;
|
324
324
|
case 403:
|
325
|
-
error.append("
|
325
|
+
error.append("request forbidden by server " POSSIBLE_MITM_RESOLUTION);
|
326
326
|
break;
|
327
327
|
case 503:
|
328
328
|
error.append("server temporarily unavailable, try again later");
|
@@ -646,7 +646,7 @@ public:
|
|
646
646
|
string data64 = responseJson["data"].asString();
|
647
647
|
|
648
648
|
signatureChars = (char *)malloc(modp_b64_decode_len(signature64.length()));
|
649
|
-
dataChars = (char *)malloc(modp_b64_decode_len(data64.length()));
|
649
|
+
dataChars = (char *)malloc(modp_b64_decode_len(data64.length()) + 1);
|
650
650
|
if (signatureChars == NULL || dataChars == NULL) {
|
651
651
|
logUpdateFailResponse("out of memory", responseData);
|
652
652
|
break;
|
@@ -667,14 +667,14 @@ public:
|
|
667
667
|
int dataLen;
|
668
668
|
dataLen = modp_b64_decode(dataChars, data64.c_str(), data64.length());
|
669
669
|
if (dataLen <= 0) {
|
670
|
-
logUpdateFailResponse("corrupted data",
|
670
|
+
logUpdateFailResponse("corrupted data", data64.c_str());
|
671
671
|
break;
|
672
672
|
}
|
673
673
|
dataChars[dataLen] = '\0';
|
674
674
|
|
675
675
|
Json::Value responseDataJson;
|
676
676
|
if (!reader.parse(dataChars, responseDataJson, false)) {
|
677
|
-
logUpdateFailResponse("unparseable data",
|
677
|
+
logUpdateFailResponse("unparseable data", dataChars);
|
678
678
|
break;
|
679
679
|
}
|
680
680
|
P_DEBUG("data content (signature OK): " << responseDataJson.toStyledString());
|
data/src/agent/Watchdog/Config.h
CHANGED
@@ -154,7 +154,7 @@ using namespace std;
|
|
154
154
|
* security_update_checker_interval unsigned integer - default(86400)
|
155
155
|
* security_update_checker_proxy_url string - -
|
156
156
|
* security_update_checker_url string - default("https://securitycheck.phusionpassenger.com/v1/check.json")
|
157
|
-
* server_software string - default("Phusion_Passenger/6.0.
|
157
|
+
* server_software string - default("Phusion_Passenger/6.0.19")
|
158
158
|
* setsid boolean - default(false)
|
159
159
|
* show_version_in_header boolean - default(true)
|
160
160
|
* single_app_mode_app_root string - default,read_only
|
@@ -83,7 +83,7 @@
|
|
83
83
|
#define PASSENGER_API_VERSION_MAJOR 0
|
84
84
|
#define PASSENGER_API_VERSION_MINOR 3
|
85
85
|
#define PASSENGER_DEFAULT_USER "nobody"
|
86
|
-
#define PASSENGER_VERSION "6.0.
|
86
|
+
#define PASSENGER_VERSION "6.0.19"
|
87
87
|
#define POOL_HELPER_THREAD_STACK_SIZE 262144
|
88
88
|
#define PROCESS_SHUTDOWN_TIMEOUT 60
|
89
89
|
#define PROCESS_SHUTDOWN_TIMEOUT_DISPLAY "1 minute"
|
@@ -89,7 +89,7 @@ size_t modp_b64_decode(char* dest, const char* src, size_t len)
|
|
89
89
|
case 0:
|
90
90
|
x = d0[y[3]] | d1[y[2]] | d2[y[1]] | d3[y[0]];
|
91
91
|
if (x >= B64_BADCHAR) return -1;
|
92
|
-
#
|
92
|
+
#if BOOST_ENDIAN_BIG_BYTE
|
93
93
|
*p++ = ((modp_uint8_t*)&x)[1];
|
94
94
|
*p++ = ((modp_uint8_t*)&x)[2];
|
95
95
|
*p = ((modp_uint8_t*)&x)[3];
|
@@ -23,8 +23,12 @@
|
|
23
23
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24
24
|
# THE SOFTWARE.
|
25
25
|
|
26
|
-
import sys, os,
|
26
|
+
import sys, os, threading, signal, traceback, socket, select, struct, logging, errno
|
27
27
|
import tempfile, json, time
|
28
|
+
if sys.version_info[0] >= 3:
|
29
|
+
from importlib import util
|
30
|
+
else:
|
31
|
+
import imp
|
28
32
|
|
29
33
|
options = {}
|
30
34
|
|
@@ -37,7 +41,7 @@ def try_write_file(path, contents):
|
|
37
41
|
with open(path, 'w') as f:
|
38
42
|
f.write(contents)
|
39
43
|
except IOError as e:
|
40
|
-
logging.warn('Warning: unable to write to ' + path + ': ' + e.
|
44
|
+
logging.warn('Warning: unable to write to ' + path + ': ' + e.strerror)
|
41
45
|
|
42
46
|
def initialize_logging():
|
43
47
|
logging.basicConfig(
|
@@ -50,18 +54,21 @@ def read_startup_arguments():
|
|
50
54
|
global options
|
51
55
|
|
52
56
|
work_dir = os.getenv('PASSENGER_SPAWN_WORK_DIR')
|
57
|
+
assert work_dir is not None
|
53
58
|
path = work_dir + '/args.json'
|
54
59
|
with open(path, 'r') as f:
|
55
60
|
options = json.load(f)
|
56
61
|
|
57
62
|
def record_journey_step_begin(step, state):
|
58
63
|
work_dir = os.getenv('PASSENGER_SPAWN_WORK_DIR')
|
64
|
+
assert work_dir is not None
|
59
65
|
step_dir = work_dir + '/response/steps/' + step.lower()
|
60
66
|
try_write_file(step_dir + '/state', state)
|
61
67
|
try_write_file(step_dir + '/begin_time', str(time.time()))
|
62
68
|
|
63
69
|
def record_journey_step_end(step, state):
|
64
70
|
work_dir = os.getenv('PASSENGER_SPAWN_WORK_DIR')
|
71
|
+
assert work_dir is not None
|
65
72
|
step_dir = work_dir + '/response/steps/' + step.lower()
|
66
73
|
try_write_file(step_dir + '/state', state)
|
67
74
|
if not os.path.exists(step_dir + '/begin_time') and not os.path.exists(step_dir + '/begin_time_monotonic'):
|
@@ -73,7 +80,15 @@ def load_app():
|
|
73
80
|
|
74
81
|
sys.path.insert(0, os.getcwd())
|
75
82
|
startup_file = options.get('startup_file', 'passenger_wsgi.py')
|
76
|
-
|
83
|
+
if sys.version_info[0] >= 3:
|
84
|
+
spec = util.spec_from_file_location("passenger_wsgi", startup_file)
|
85
|
+
assert spec is not None
|
86
|
+
app_module = util.module_from_spec(spec)
|
87
|
+
assert spec.loader is not None
|
88
|
+
spec.loader.exec_module(app_module)
|
89
|
+
return app_module
|
90
|
+
else:
|
91
|
+
return imp.load_source('passenger_wsgi', startup_file)
|
77
92
|
|
78
93
|
def create_server_socket():
|
79
94
|
global options
|
@@ -88,13 +103,8 @@ def create_server_socket():
|
|
88
103
|
|
89
104
|
i = 0
|
90
105
|
while i < 128:
|
91
|
-
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
92
|
-
socket_suffix = format(struct.unpack('Q', os.urandom(8))[0], 'x')
|
93
|
-
filename = socket_dir + '/' + socket_prefix + '.' + socket_suffix
|
94
|
-
filename = filename[0:UNIX_PATH_MAX]
|
95
106
|
try:
|
96
|
-
|
97
|
-
break
|
107
|
+
return make_socket(socket_dir, socket_prefix, UNIX_PATH_MAX)
|
98
108
|
except socket.error as e:
|
99
109
|
if e.errno == errno.EADDRINUSE:
|
100
110
|
i += 1
|
@@ -103,6 +113,12 @@ def create_server_socket():
|
|
103
113
|
else:
|
104
114
|
raise e
|
105
115
|
|
116
|
+
def make_socket(socket_dir, socket_prefix, UNIX_PATH_MAX):
|
117
|
+
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
118
|
+
socket_suffix = format(struct.unpack('Q', os.urandom(8))[0], 'x')
|
119
|
+
filename = socket_dir + '/' + socket_prefix + '.' + socket_suffix
|
120
|
+
filename = filename[0:UNIX_PATH_MAX]
|
121
|
+
s.bind(filename)
|
106
122
|
s.listen(1000)
|
107
123
|
return (filename, s)
|
108
124
|
|
@@ -130,6 +146,7 @@ def install_signal_handlers():
|
|
130
146
|
|
131
147
|
def advertise_sockets(socket_filename):
|
132
148
|
work_dir = os.getenv('PASSENGER_SPAWN_WORK_DIR')
|
149
|
+
assert work_dir is not None
|
133
150
|
path = work_dir + '/response/properties.json'
|
134
151
|
doc = {
|
135
152
|
'sockets': [
|
@@ -147,6 +164,7 @@ def advertise_sockets(socket_filename):
|
|
147
164
|
|
148
165
|
def advertise_readiness():
|
149
166
|
work_dir = os.getenv('PASSENGER_SPAWN_WORK_DIR')
|
167
|
+
assert work_dir is not None
|
150
168
|
path = work_dir + '/response/finish'
|
151
169
|
with open(path, 'w') as f:
|
152
170
|
f.write('1')
|
@@ -173,7 +191,6 @@ else:
|
|
173
191
|
def str_to_bytes(s):
|
174
192
|
return s
|
175
193
|
|
176
|
-
|
177
194
|
class RequestHandler:
|
178
195
|
def __init__(self, server_socket, owner_pipe, app):
|
179
196
|
self.server = server_socket
|
@@ -194,13 +211,12 @@ class RequestHandler:
|
|
194
211
|
env, input_stream = self.parse_request(client)
|
195
212
|
if env:
|
196
213
|
if env['REQUEST_METHOD'] == 'ping':
|
197
|
-
self.process_ping(
|
214
|
+
self.process_ping(client)
|
198
215
|
else:
|
199
216
|
socket_hijacked = self.process_request(env, input_stream, client)
|
200
217
|
except KeyboardInterrupt:
|
201
218
|
done = True
|
202
|
-
except IOError:
|
203
|
-
e = sys.exc_info()[1]
|
219
|
+
except IOError as e:
|
204
220
|
if not getattr(e, 'passenger', False) or e.errno != errno.EPIPE:
|
205
221
|
logging.exception("WSGI application raised an I/O exception!")
|
206
222
|
except Exception:
|
@@ -298,10 +314,9 @@ class RequestHandler:
|
|
298
314
|
output_stream.sendall(b'\r\n')
|
299
315
|
if not is_head:
|
300
316
|
output_stream.sendall(str_to_bytes(data))
|
301
|
-
except IOError:
|
317
|
+
except IOError as e:
|
302
318
|
# Mark this exception as coming from the Phusion Passenger
|
303
319
|
# socket and not some other socket.
|
304
|
-
e = sys.exc_info()[1]
|
305
320
|
setattr(e, 'passenger', True)
|
306
321
|
raise e
|
307
322
|
|
@@ -347,7 +362,7 @@ class RequestHandler:
|
|
347
362
|
result.close()
|
348
363
|
return False
|
349
364
|
|
350
|
-
def process_ping(self,
|
365
|
+
def process_ping(self, output_stream):
|
351
366
|
output_stream.sendall(b"pong")
|
352
367
|
|
353
368
|
|
@@ -376,7 +391,9 @@ if __name__ == "__main__":
|
|
376
391
|
|
377
392
|
record_journey_step_begin('SUBPROCESS_LISTEN', 'STEP_IN_PROGRESS')
|
378
393
|
try:
|
379
|
-
|
394
|
+
tuple = create_server_socket()
|
395
|
+
assert tuple is not None
|
396
|
+
socket_filename, server_socket = tuple
|
380
397
|
install_signal_handlers()
|
381
398
|
handler = RequestHandler(server_socket, sys.stdin, app_module.application)
|
382
399
|
advertise_sockets(socket_filename)
|
@@ -41,7 +41,7 @@ module PhusionPassenger
|
|
41
41
|
module ThreadHandlerExtension
|
42
42
|
# Constants which exist to relieve Ruby's garbage collector.
|
43
43
|
RACK_VERSION = "rack.version" # :nodoc:
|
44
|
-
RACK_VERSION_VALUE = [1,
|
44
|
+
RACK_VERSION_VALUE = [1, 3] # :nodoc:
|
45
45
|
RACK_INPUT = "rack.input" # :nodoc:
|
46
46
|
RACK_ERRORS = "rack.errors" # :nodoc:
|
47
47
|
RACK_MULTITHREAD = "rack.multithread" # :nodoc:
|
@@ -349,6 +349,8 @@ module PhusionPassenger
|
|
349
349
|
headers.each do |key, values|
|
350
350
|
if values.is_a?(String)
|
351
351
|
values = values.split(NEWLINE)
|
352
|
+
elsif values.is_a?(Array)
|
353
|
+
# values already array
|
352
354
|
elsif key == RACK_HIJACK
|
353
355
|
# We do not check for this key name in every loop
|
354
356
|
# iteration as an optimization.
|
@@ -147,6 +147,11 @@ module Signal
|
|
147
147
|
result.delete("KILL")
|
148
148
|
result.delete("EXIT")
|
149
149
|
|
150
|
+
# Profilers such as ddtrace and stackprof use this signal, so removing the
|
151
|
+
# the handler causes the Ruby process to crash when profilers are operating.
|
152
|
+
# See https://github.com/phusion/passenger/issues/2489 for details.
|
153
|
+
result.delete("PROF")
|
154
|
+
|
150
155
|
return result
|
151
156
|
end
|
152
157
|
end
|
@@ -31,7 +31,7 @@ module PhusionPassenger
|
|
31
31
|
|
32
32
|
PACKAGE_NAME = 'passenger'
|
33
33
|
# Run 'rake src/cxx_supportlib/Constants.h configkit_schemas_inline_comments' after changing this number.
|
34
|
-
VERSION_STRING = '6.0.
|
34
|
+
VERSION_STRING = '6.0.19'
|
35
35
|
|
36
36
|
# Tip: find the SHA-256 with ./dev/nginx_version_sha2 <VERSION>
|
37
37
|
PREFERRED_NGINX_VERSION = '1.24.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: passenger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phusion - http://www.phusion.nl/
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -5068,8 +5068,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
5068
5068
|
- !ruby/object:Gem::Version
|
5069
5069
|
version: '0'
|
5070
5070
|
requirements: []
|
5071
|
-
|
5072
|
-
rubygems_version: 2.6.11
|
5071
|
+
rubygems_version: 3.2.33
|
5073
5072
|
signing_key:
|
5074
5073
|
specification_version: 4
|
5075
5074
|
summary: A fast and robust web server and application server for Ruby, Python and
|