Mercurial > hg > nginx
comparison auto/cc/sunc @ 9309:92e14ce71b72
Configure: adjusted optimization level for Sun C.
With "-fast" (and with "-xbuiltin=%all -xO4"), Sun C miscompiles
ngx_http_script_add_copy_code(), which is inlined into
ngx_http_script_compile(). From the assembly code it looks like
the code uses uninitialized register when calculating new p value
after memcpy:
movq %r15,%rdi
call _memcpy
leaq (%r15,rbx),%rax
movq (%r12),%rbx
movb $0x0000000000000000,(%rax)
Note that %rax is set to (%r15 + %rbx), but %rbx is only set after
it is used. As such, "*p = '\0'" tries to modify an unrelated memory
address, leading to a segmentation fault.
The issue was seen in tests which use null-terminated complex values:
proxy_ssl_certificate_vars.t, uwsgi_ssl_certificate_vars.t,
stream_proxy_ssl_certificate_vars.t. Tested with Sun C compilers
from Sun Studio 12.3, 12.4, 12.5, and 12.6.
Restructuring code, such as splitting ngx_cpymem() with a separate
"p += value->len" increment, fixes things, but it is not clear if its
the only place where such miscompilation can happen.
Fix is to use "-fast -xO3". Since IPO requires "-xO5", it is commented
out.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 07 Aug 2024 03:56:23 +0300 |
parents | d2b87352e5a7 |
children |
comparison
equal
deleted
inserted
replaced
9308:d2b87352e5a7 | 9309:92e14ce71b72 |
---|---|
71 # optimizations | 71 # optimizations |
72 | 72 |
73 # 20736 == 0x5100, Sun Studio 12.1 | 73 # 20736 == 0x5100, Sun Studio 12.1 |
74 | 74 |
75 if [ "$ngx_sunc_ver" -ge 20736 ]; then | 75 if [ "$ngx_sunc_ver" -ge 20736 ]; then |
76 ngx_fast="-fast" | 76 ngx_fast="-fast -xO3" |
77 | 77 |
78 else | 78 else |
79 # older versions had problems with bit-fields | 79 # older versions had problems with bit-fields |
80 ngx_fast="-fast -xalias_level=any" | 80 ngx_fast="-fast -xO3 -xalias_level=any" |
81 fi | 81 fi |
82 | 82 |
83 IPO=-xipo | 83 IPO= |
84 #IPO=-xipo | |
85 | |
84 CFLAGS="$CFLAGS $ngx_fast $IPO" | 86 CFLAGS="$CFLAGS $ngx_fast $IPO" |
85 CORE_LINK="$CORE_LINK $ngx_fast $IPO" | 87 CORE_LINK="$CORE_LINK $ngx_fast $IPO" |
86 | 88 |
87 | 89 |
88 case $CPU in | 90 case $CPU in |