Mercurial > prosody-hg
comparison plugins/mod_proxy65.lua @ 14149:9c98cc9d9588 13.0
mod_proxy65: Don't link connections until after activation
Although the module pauses the connections, in some cases server.link() (at
least with the epoll backend) will have the effect of unpausing the connection
(because it sets new read handlers).
Many thanks to Max Hearnden for discovering and reporting this issue.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 29 Apr 2026 11:37:21 +0100 |
| parents | 74b9e05af71e |
| children | 2a66728d9e29 |
comparison
equal
deleted
inserted
replaced
| 14148:4b8cf9420cf1 | 14149:9c98cc9d9588 |
|---|---|
| 58 module:log("debug", "SOCKS5 target connected for session %s", sha); | 58 module:log("debug", "SOCKS5 target connected for session %s", sha); |
| 59 else -- transfers[sha].target ~= nil | 59 else -- transfers[sha].target ~= nil |
| 60 transfers[sha].initiator = conn; | 60 transfers[sha].initiator = conn; |
| 61 session.sha = sha; | 61 session.sha = sha; |
| 62 module:log("debug", "SOCKS5 initiator connected for session %s", sha); | 62 module:log("debug", "SOCKS5 initiator connected for session %s", sha); |
| 63 server.link(conn, transfers[sha].target, max_buffer_size); | |
| 64 server.link(transfers[sha].target, conn, max_buffer_size); | |
| 65 end | 63 end |
| 66 else -- error, unexpected input | 64 else -- error, unexpected input |
| 67 conn:write("\5\1\0\3\0\0\0"); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte) | 65 conn:write("\5\1\0\3\0\0\0"); -- VER, REP, RSV, ATYP, BND.ADDR (sha), BND.PORT (2 Byte) |
| 68 conn:close(); | 66 conn:close(); |
| 69 module:log("debug", "Invalid SOCKS5 negotiation received: %q", data:sub(1, 300)); | 67 module:log("debug", "Invalid SOCKS5 negotiation received: %q", data:sub(1, 300)); |
| 164 -- module:log("debug", "The recipient was not connected to the proxy; activation failed (%s)", info); | 162 -- module:log("debug", "The recipient was not connected to the proxy; activation failed (%s)", info); |
| 165 -- origin.send(st.error_reply(stanza, "cancel", "not-allowed", "The recipient is not connected to the proxy")); | 163 -- origin.send(st.error_reply(stanza, "cancel", "not-allowed", "The recipient is not connected to the proxy")); |
| 166 else -- if transfers[sha].initiator ~= nil and transfers[sha].target ~= nil then | 164 else -- if transfers[sha].initiator ~= nil and transfers[sha].target ~= nil then |
| 167 module:log("debug", "Transfer activated (%s)", info); | 165 module:log("debug", "Transfer activated (%s)", info); |
| 168 transfers[sha].activated = true; | 166 transfers[sha].activated = true; |
| 167 server.link(transfers[sha].initiator, transfers[sha].target, max_buffer_size); | |
| 168 server.link(transfers[sha].target, transfers[sha].initiator, max_buffer_size); | |
| 169 transfers[sha].target:resume(); | 169 transfers[sha].target:resume(); |
| 170 transfers[sha].initiator:resume(); | 170 transfers[sha].initiator:resume(); |
| 171 origin.send(st.reply(stanza)); | 171 origin.send(st.reply(stanza)); |
| 172 end | 172 end |
| 173 elseif to and sid then | 173 elseif to and sid then |
