diff options
author | Sverker Eriksson <[email protected]> | 2018-11-27 21:16:47 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2018-11-28 20:32:23 +0100 |
commit | 0ad63bcc5523f0b560c843b3ed02c08e1369e522 (patch) | |
tree | 7fb5b6fc9c4e48e1f8106cc0d1898b6de351103a | |
parent | 9103097e3480b5fa8737205793df56c6288f5733 (diff) | |
download | otp-0ad63bcc5523f0b560c843b3ed02c08e1369e522.tar.gz otp-0ad63bcc5523f0b560c843b3ed02c08e1369e522.tar.bz2 otp-0ad63bcc5523f0b560c843b3ed02c08e1369e522.zip |
erts: Fix bug in sendfile for active socket
driver_select() was called after port had been killed
by tcp_inet_sendfile() calling tcp_send_error().
-rw-r--r-- | erts/emulator/drivers/common/inet_drv.c | 11 | ||||
-rw-r--r-- | lib/kernel/test/sendfile_SUITE.erl | 14 |
2 files changed, 15 insertions, 10 deletions
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c index 259a27cf57..d8491ba18b 100644 --- a/erts/emulator/drivers/common/inet_drv.c +++ b/erts/emulator/drivers/common/inet_drv.c @@ -10204,12 +10204,11 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd, desc->tcp_add_flags |= TCP_ADDF_SENDFILE; /* See if we can finish sending without selecting & rescheduling. */ - tcp_inet_sendfile(desc); - - if(desc->sendfile.length > 0) { - sock_select(INETP(desc), FD_WRITE, 1); + if (tcp_inet_sendfile(desc) == 0) { + if(desc->sendfile.length > 0) { + sock_select(INETP(desc), FD_WRITE, 1); + } } - return ctl_reply(INET_REP_OK, NULL, 0, rbuf, rsize); #else return ctl_error(ENOTSUP, rbuf, rsize); @@ -11692,8 +11691,8 @@ socket_error: { DEBUGF(("tcp_inet_sendfile(%ld): send errno = %d (errno %d)\r\n", (long)desc->inet.port, socket_errno, errno)); - result = tcp_send_error(desc, socket_errno); tcp_sendfile_aborted(desc, socket_errno); + result = tcp_send_error(desc, socket_errno); goto done; } diff --git a/lib/kernel/test/sendfile_SUITE.erl b/lib/kernel/test/sendfile_SUITE.erl index 0c0b1cbcb6..062209fa29 100644 --- a/lib/kernel/test/sendfile_SUITE.erl +++ b/lib/kernel/test/sendfile_SUITE.erl @@ -341,7 +341,9 @@ t_sendfile_closeduring(Config) -> -1 end, - ok = sendfile_send({127,0,0,1}, Send, 0). + ok = sendfile_send({127,0,0,1}, Send, 0, [{active,false}]), + ok = sendfile_send({127,0,0,1}, Send, 0, [{active,true}]). + t_sendfile_crashduring(Config) -> Filename = proplists:get_value(big_file, Config), @@ -409,12 +411,16 @@ sendfile_send(Send) -> sendfile_send(Host, Send) -> sendfile_send(Host, Send, []). sendfile_send(Host, Send, Orig) -> + sendfile_send(Host, Send, Orig, [{active,false}]). + +sendfile_send(Host, Send, Orig, SockOpts) -> + SFServer = spawn_link(?MODULE, sendfile_server, [self(), Orig]), receive {server, Port} -> - {ok, Sock} = gen_tcp:connect(Host, Port, - [binary,{packet,0}, - {active,false}]), + Opts = [binary,{packet,0}|SockOpts], + io:format("connect with opts = ~p\n", [Opts]), + {ok, Sock} = gen_tcp:connect(Host, Port, Opts), Data = case proplists:get_value(arity,erlang:fun_info(Send)) of 1 -> Send(Sock); |