Bug #20592
closedInterrupting Addrinfo causes Segmentation fault on alpine
Description
On Alpine 3.20 got a segfault when interrupting Addrinfo request which would resolve with error.
Same on
ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux-musl]
Tried on docker image alpine3.20 and ruby:3.4.0-preview1-alpine.
# test.rb
require 'socket'
require 'timeout'
begin
Addrinfo.ip("1234.example.com")
rescue StandardError => e
puts e
end
sleep 10 # wait getaddrinfo to resolve and fail
/app # ruby test.rb
execution expired
[BUG] Segmentation fault at 0x0000000000000028
ruby 3.4.0preview1 (2024-05-16 master 9d69619623) [x86_64-linux-musl]
-- Machine register context ------------------------------------------------
RIP: 0x00007fefe4cd4886 RBP: 0x0000000000000001 RSP: 0x00007fefc95d3a10
RAX: 0x0000000000000001 RBX: 0x00007fefc94212e0 RCX: 0x00007fefc95d0b70
RDX: 0x0000000000000010 RDI: 0x0000000000000000 RSI: 0x00007fefc95d08f0
R8: 0x0000000000000000 R9: 0x0000000000000000 R10: 0x0000000000000000
R11: 0x0000000000000217 R12: 0x00007fefc9421340 R13: 0x00007fff5a0ec750
R14: 0x00007fefe4649b10 R15: 0x00007fefc95d3b38 EFL: 0x0000000000010202
-- Other runtime information -----------------------------------------------
gdb logs
/app # gdb -q --args ruby test.rb
(gdb) run
Starting program: /usr/local/bin/ruby test.rb
warning: Error disabling address space randomization: Operation not permitted
[New LWP 36]
[New LWP 37]
[New LWP 38]
execution expired
Thread 4 "ruby" received signal SIGSEGV, Segmentation fault.
[Switching to LWP 38]
0x00007f0a2c33b886 in freeaddrinfo (p=0x0) at src/network/freeaddrinfo.c:10
warning: 10 src/network/freeaddrinfo.c: No such file or directory
(gdb) bt
#0 0x00007f0a2c33b886 in freeaddrinfo (p=0x0) at src/network/freeaddrinfo.c:10
#1 0x00007f0a10c1e940 in do_getaddrinfo (ptr=0x7f0a10f61200) at raddrinfo.c:426
#2 0x00007f0a2c35c349 in start (p=0x7f0a10afaa88) at src/thread/pthread_create.c:207
#3 0x00007f0a2c35e95f in __clone () at src/thread/x86_64/clone.s:22
Backtrace stopped: frame did not save the PC
(gdb) info args
p = 0x0
There are no errors if Addrinfo resolves with data
Timeout.timeout(0.01) { Addrinfo.ip("ruby-lang.org") } # finishes correctly
The problem is that freeaddrinfo on alpine does not accept a NULL pointer (ref
https://git.musl-libc.org/cgit/musl/tree/src/network/freeaddrinfo.c)
Files
Updated by haukot (Dmitry Davydov) 6 months ago
Updated by haukot (Dmitry Davydov) 6 months ago
- File segfault.txt segfault.txt added
- File segfault_gdb.txt segfault_gdb.txt added
Updated by haukot (Dmitry Davydov) 6 months ago
- Status changed from Open to Closed
Applied in changeset git|fba8aff7af450e476e97b62385427dfa51850955.
[Bug #20592] Fix segfault when sending NULL to freeaddrinfo
On alpine freeaddrinfo does not accept NULL pointer
Updated by mame (Yusuke Endoh) 6 months ago
- Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN to 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: REQUIRED
Thanks! Looks good to me. I have merged your PR.
Updated by nagachika (Tomoyuki Chikanaga) 6 months ago
- Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: REQUIRED to 3.1: UNKNOWN, 3.2: REQUIRED, 3.3: REQUIRED
Updated by mame (Yusuke Endoh) 6 months ago
@nagachika (Tomoyuki Chikanaga) @k0kubun (Takashi Kokubun) When you backport this patch, please backport d8c6e91748871ab2287d7703347847fe18a292d2 as well. FYI.
Updated by k0kubun (Takashi Kokubun) 6 months ago
- Backport changed from 3.1: UNKNOWN, 3.2: REQUIRED, 3.3: REQUIRED to 3.1: UNKNOWN, 3.2: REQUIRED, 3.3: DONE
ruby_3_3 9d583dd43a24354e8ae58c089cf091c1243e6e60 merged revision(s) fba8aff7, d8c6e91748871ab2287d7703347847fe18a292d2.
Updated by nagachika (Tomoyuki Chikanaga) 5 months ago
- Backport changed from 3.1: UNKNOWN, 3.2: REQUIRED, 3.3: DONE to 3.1: UNKNOWN, 3.2: DONE, 3.3: DONE
ruby_3_2 3fe51aa26867159af574fac8eba7ae86a0b30971 merged revision(s) fba8aff7af450e476e97b62385427dfa51850955, d8c6e91748871ab2287d7703347847fe18a292d2.