# HG changeset patch # User Roman Arutyunyan # Date 1513699227 -10800 # Node ID 7f28b61c92f0a39de760f822c2a48588f1b8d80f # Parent 56923e8e01a5bd56c3f3d1361ef01e871c37dd4e Fixed capabilities version. 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). diff --git a/auto/os/linux b/auto/os/linux --- a/auto/os/linux +++ b/auto/os/linux @@ -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; diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c @@ -865,7 +865,7 @@ ngx_worker_process_init(ngx_cycle_t *cyc 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;