Age | Commit message (Collapse) | Author |
|
* sverk/misc-valgrind-fixes:
erts: Suppress valgrind warning about syscall sendmsg
erts: Fix memory leak in test drivers
erts: Small fix in inet_drv.c:sctp_set_opts
|
|
Valgrind complains: "Syscall param socketcall.sendmsg(msg.msg_control)
points to uninitialised byte(s)".
Seems valgrind do not know which bytes of msg_control are padding.
|
|
|
|
Allow applications to use a packet_size setting on a socket to control
acceptable HTTP header line length. This gives them the ability to
accept HTTP headers larger than the default settings allow, but also
lets them avoid DOS attacks by accepting header lines only up to
whatever length they wish to allow.
Without this change, if an HTTP request/response line or header
arrives on a socket in http, http_bin, httph, or httph_bin parsing
mode, and the request/response line or header is too long to fit into
a default inet_drv buffer of 1460 bytes, an unexpected error
occurs. These problems were described and discussed on
erlang-questions in June 2011 in this thread:
http://erlang.org/pipermail/erlang-questions/2011-June/059563.html
In the original code, no buffer reallocation occurs to enlarge the
buffer, even if packet_size or line_length are set in a way that
should allow the HTTP data to be parsed properly. The only available
workaround was to collect headers and parse them using
erlang:decode_packet, but that approach has drawbacks such as having
to collect all HTTP header data before it can be handed to
decode_packet for correct parsing, and also requiring each and every
Erlang web server developer/maintainer to add the workaround to his or
her web server.
Change the packet parser to honor the packet_size setting for HTTP
parsing. If packet_size is set, and an HTTP request/response or header
line exceeds the default 1460 byte TCP buffer limit, return an
indication to tcp_remain that it should realloc the buffer to enlarge
it to packet_size. Also fix the HTTP parsing code to properly honor
line_length by truncating any HTTP request/response or header lines
that exceed that setting.
For backward compatibility, default behavior is unchanged; if an
application wants to be able to accept long HTTP header lines, it must
set packet_size to an appropriate value. Buffer reallocation occurs
only when needed, so the original default buffer size in the code is
still the default.
Make the line mode parsing honor packet_size as well, for consistency.
Add new regression tests to the emulator decode_packet suite and also
to the kernel gen_tcp_misc suite.
The documentation for packet_size in inet:setopts/2 is already
sufficient.
Many thanks to Sverker Eriksson for his guidance on how to best fix
this bug and also for reviewing a number of patch attempts prior to
this one.
|
|
Can still not setup -a, but cerl works.
|
|
* ta/sendfile/OTP-9240: (31 commits)
Add sendfile server printouts
Skip recv/send during tests for fallback platforms
Remove header/trailer support
Remove windows implementation
Expand sendfile documentation
Only allow tcp sockets as target for sendfile
Move sendfile api to file module
Preliminary work on header/trailer
Use free_sendfile explicitly for non-async
Remove debug printouts
Add tests for send/recv/sendfile interactions
Remove tests for file_server sendfile
sendfile caller now has to be the controlling_process
Remove support for file_server, sendfile has to be raw
Set chunk size to 3 GB
Change type of fd to be ErlDrvEvent
Add ifdef's for HAVE_SENDFILE
Fix freebsd support for sendfile
Change nbytes to 64 bit
Implement ignorefd for TCP
...
|
|
Ignore fd is a feature used by sendfile to temporarily remove
all driver_select calls on that fd so that another driver can
select on it. It also delays all actions which sends or receives
data in that fd until in the fd is no longer ignored.
Only the controlling_process should use the feature as it is otherwise
possible that the ignore will never be cleaned up and hence create
a memory leak in the driver.
An ignored driver will not detect that an fd has been closed until
it is unignored.
|
|
* tn/inet_drv-fix:
Cleanup - remove unnecesary bracket level and configure for ifreq.ifr_enaddr
Work around gcc linking with own view of default libs on Solaris
Use libdlpi to get physical address
|
|
|
|
Also use 64-bit lib when necessary, specify runtime lib path
for secondary dependency libs, and better check before using
SIOCGIFHWADDR.
|
|
Caused core dump with gen_udp_SUITE on halfword vm.
|
|
|
|
* pan/binary_match_scope/OTP-9701:
Remove remaining gcc 4.6 assigned-but-not-used warnings from erts
Remove GCC 4.6 set-but-not-used warning from erl_bif_binary
Make binary:match with scope return correct values
|
|
* raimo/sctp-dev/OTP-9239: (21 commits)
erts: Possible bugfix for error chunk on old Solaris 10
kernel: Documented gen_sctp:peeloff/2
kernel: Adjust SCTP test to SuSE quirk
erts: Fixes for SCTP on old Solaris 10
Update preloaded files
erts,kernel: Return eprotonosupport when SCTP is not supported
kernel: Adjust SCTP tests to Solaris quirks
erts: Fix SCTP decoding byteorder bug for adaptation_ind
kernel: Rewrite SCTP test socket handler
kernel: Fix SCTP tests for the FreeBSD protocol stack
kernel: Bugfix - SCTP connect with sndrcvinfo in assoc_change event
erts: Default enable SCTP in configure
Update primary bootstrap and preloaded files
erts: Use SCTP functions in default libs
erts: Improve SCTP message defragmenting
erts,kernel: Bugfix - collect fragmented SCTP messages on recv
kernel: Add tests for gen_sctp:peeloff/2
erts,kernel: Implement gen_sctp:peeloff/2
kernel: Add tests for SCTP stream sockets
erts,kernel: Add type stream sockets to SCTP
...
|
|
|
|
* sverker/valgrind-fixing:
erts: valgrind suppressions for prebuilt terms in os_info_init
Fix dlopen-leak of drivers with incorrect version
erts: Add valgrind suppression files
erts: Remove valgrind limit for erts_alloc_permanent_cache_aligned
erts: Fix write-after-free bug in inet driver
ETS: Fix faulty size calculation SIZEOF_EXTSEG
ETS: Fix valgrind PossiblyLost in ETS hash tables
|
|
|
|
|
|
On e.g FreeBSD the functions sctp_bindx() and sctp_peeloff() do not require
any extra linkage library flags and there is no dynamic lib to load
for them; use configure to find them.
|
|
Receive several fragments within the same receive loop if possible.
|
|
|
|
|
|
|
|
|
|
|
|
* bjorn/some-configure-clean-ups:
erts/configure.in: Remove test for reversed setvbuf() arguments
erts/configure.in: Remove broken support for System V
erts/configure.in: Don't check for the presence of mach-o/dyld.h
erts/configure.in: Remove useless --disable-fixalloc option
|
|
Bug caught by valgrind but never confirmed as cause of a real problem.
Triggered by emulator_test/distribution_SUITE:bad_dist_structure
when bad data is received to a distribution port. Port is closed by
erts_net_message() and the freed port data is then later used when returning
to inet_drv. Everything happens in the same call to tcp_inet_input().
==32592== Invalid read of size 8
==32592== at 0x5B6D8C: tcp_deliver (inet_drv.c:8536)
==32592== by 0x5B720E: tcp_recv (inet_drv.c:8652)
==32592== by 0x5B7753: tcp_inet_input (inet_drv.c:8990)
==32592== by 0x5B7FA5: tcp_inet_drv_input (inet_drv.c:9257)
==32592== by 0x4B900C: erts_port_task_execute (erl_port_task.c:856)
==32592== by 0x4AC873: schedule (erl_process.c:5511)
==32592== by 0x5527CA: process_main (beam_emu.c:1225)
==32592== by 0x4A9958: sched_thread_func (erl_process.c:3789)
==32592== by 0x5E2971: thr_wrapper (ethread.c:106)
==32592== by 0x4FEA142: start_thread (in /lib64/libpthread-2.4.so)
==32592== by 0x52C374C: clone (in /lib64/libc-2.4.so)
==32592== Address 0x9b13ea8 is 440 bytes inside a block of size 488 free'd
==32592== at 0x4A1FE94: free (vg_replace_malloc.c:366)
==32592== by 0x58AE69: erts_sys_free (sys.c:2588)
==32592== by 0x48E54F: erts_free (erl_alloc.h:218)
==32592== by 0x497390: driver_free (io.c:3527)
==32592== by 0x5B2E77: inet_stop (inet_drv.c:7152)
==32592== by 0x5B502F: tcp_inet_stop (inet_drv.c:7855)
==32592== by 0x492E60: terminate_port (io.c:1849)
==32592== by 0x493971: erts_do_exit_port (io.c:2059)
==32592== by 0x4CEE01: erts_net_message (dist.c:1508)
==32592== by 0x496AC1: driver_output2 (io.c:3294)
==32592== by 0x5AAA69: inet_port_data (inet_drv.c:1894)
==32592== by 0x5AD57E: tcp_reply_data (inet_drv.c:3181)
==32592== by 0x5B6D84: tcp_deliver (inet_drv.c:8533)
==32592== by 0x5B720E: tcp_recv (inet_drv.c:8652)
==32592== by 0x5B7753: tcp_inet_input (inet_drv.c:8990)
Fixed by checking the negative return code earlier in tcp_deliver().
|
|
* raimo/sctp-getsetopts-dev/OTP-9544:
erts,kernel: Bugfix - read SCTP socket options from right protocol layer
erts: Fix bug SCTP send can only be called from controlling process
|
|
raimo/sctp-getsetopts-dev/OTP-9544
Conflicts:
erts/emulator/drivers/common/inet_drv.c
lib/kernel/test/gen_sctp_SUITE.erl
|
|
Socket options 'sndbuf', 'recbuf' and 'linger were read from
the SCTP protocol layer instead of from the socket protocol layer.
Conflicts:
lib/kernel/test/gen_sctp_SUITE.erl
|
|
Conflicts:
lib/kernel/test/gen_sctp_SUITE.erl
|
|
|
|
If we are compiling on System V, the symbols NO_WEAK_PRAGMA and
SOCKOPT_CONNECT_STAT are defined, but they are never used.
|
|
If an IPv4 fd is opened as an IPv6 socket, unexpected behaviour can
occur. For example, if an IPv4 UDP socket is opened and passed into
Erlang as an IPv6 socket, the first 3 bytes (corresponding to 1 byte
representing the protocol family, 2 bytes set to the port) are stripped
from the payload. The cause of the UDP payload truncation happens in
inet_drv.c:packet_inet_input when a call to inet_get_address fails
silently because the family is set to PF_INET6 but the buffer len is
the size of an IPv4 struct sockaddr_in.
Prevent this behaviour by checking that the protocol family of the file
descriptor matches the family of the requested Erlang socket.
{ok, S1} = gen_udp:open(0, [binary, inet]),
{ok, FD} = inet:getfd(S1),
{ok, Port} = inet:port(S1),
{ok, S} = gen_udp:open(Port, [binary, {fd, FD}, inet6]),
{ok, C} = gen_udp:open(0, [binary]),
Msg = <<1,2,3,4,5>>,
gen_udp:send(C, "127.0.0.1", Port, Msg),
receive
{udp, S, _, _, Msg} -> ok;
{udp, S, _, _, NewMsg} -> {error, Msg, NewMsg}
end.
This test results in: {error,<<1,2,3,4,5>>,<<4,5>>}
Thanks to Andrew Tunnell-Jones for finding the bug and the test case!
|
|
|
|
|
|
|
|
|
|
Per H @ Tail-f: The original code here had problems that possibly
only occur if you abuse it for non-INET sockets, but anyway:
a) If the getsockopt for SO_PRIORITY or IP_TOS failed, the actual
requested setsockopt was never even attempted.
b) If {get,set}sockopt for one of IP_TOS and SO_PRIORITY failed,
but ditto for the other worked and that was actually the requested
option, failure was still reported to erlang.
|
|
|
|
|
|
* pan/inet6_corrections/OTP-8969:
Stop using uncertain flags for getaddrinfo()
Teach inet_test_lib to understand enetunreach
Make windows inet_gethost work for ipv6
|
|
The AI_V4MAPPED flag is falling out of grace in modern
IPv6 stacks, for security reasons, e.g. FreeBSD do not
document it any longer. The AI_ADDRCONFIG flag have
got unclear semantics on the same OS.
|
|
|
|
* rickard/thr-spec-inet-buf/OTP-8916:
Remove tight restrictions on some options
Thread specific inet driver buffer stack
|
|
Remove tight restrictions on the high_watermark, low_watermark, and
buffer options.
|
|
The inet driver internal buffer stack implementation
has been rewritten in order to reduce lock contention.
|
|
|
|
|
|
|