]> git.kaiwu.me - nginx.git/commitdiff
Fixed capabilities version.
authorRoman Arutyunyan <arut@nginx.com>
Tue, 19 Dec 2017 16:00:27 +0000 (19:00 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Tue, 19 Dec 2017 16:00:27 +0000 (19:00 +0300)
Previously, capset(2) was called with the 64-bit capabilities version
_LINUX_CAPABILITY_VERSION_3.  With this version Linux kernel expected two
copies of struct __user_cap_data_struct, while only one was submitted.  As a
result, random stack memory was accessed and random capabilities were requested
by the worker.  This sometimes caused capset() errors.  Now the 32-bit version
_LINUX_CAPABILITY_VERSION_1 is used instead.  This is OK since CAP_NET_RAW is
a 32-bit capability (CAP_NET_RAW = 13).

auto/os/linux
src/os/unix/ngx_process_cycle.c

index 135280f990b00c9747ca805a0c3288212105b214..2c8a9bb8e3807dfb26cbcf9fd529ea688699b20e 100644 (file)
@@ -181,7 +181,7 @@ ngx_feature_libs=
 ngx_feature_test="struct __user_cap_data_struct    data;
                   struct __user_cap_header_struct  header;
 
-                  header.version = _LINUX_CAPABILITY_VERSION_3;
+                  header.version = _LINUX_CAPABILITY_VERSION_1;
                   data.effective = CAP_TO_MASK(CAP_NET_RAW);
                   data.permitted = 0;
 
index 9b0e0421e3910d22bb4f1feb85d7044642d33584..5817a2c23b83bd700e22c3a94ded15aaf5b89408 100644 (file)
@@ -865,7 +865,7 @@ ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)
             ngx_memzero(&header, sizeof(struct __user_cap_header_struct));
             ngx_memzero(&data, sizeof(struct __user_cap_data_struct));
 
-            header.version = _LINUX_CAPABILITY_VERSION_3;
+            header.version = _LINUX_CAPABILITY_VERSION_1;
             data.effective = CAP_TO_MASK(CAP_NET_RAW);
             data.permitted = data.effective;