Skip to content

Commit

Permalink
fix: encode ip in network byte order for udp announce (#6126) (#6132)
Browse files Browse the repository at this point in the history
* fix: encode `ip` in network byte order for udp announce (#6126)

(cherry picked from commit c70c49e)

* fixup! fix: encode `ip` in network byte order for udp announce (#6126)
  • Loading branch information
tearfur committed Oct 20, 2023
1 parent ba36954 commit 90b86a1
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 5 deletions.
18 changes: 13 additions & 5 deletions libtransmission/announcer-udp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,10 @@ struct tau_scrape_request

struct tau_announce_request
{
tau_announce_request(uint32_t announce_ip, tr_announce_request const& in, tr_announce_response_func on_response)
tau_announce_request(
std::optional<tr_address> announce_ip,
tr_announce_request const& in,
tr_announce_response_func on_response)
: on_response_{ std::move(on_response) }
{
// https://www.bittorrent.org/beps/bep_0015.html sets key size at 32 bits
Expand All @@ -187,7 +190,14 @@ struct tau_announce_request
buf.add_uint64(in.leftUntilComplete);
buf.add_uint64(in.up);
buf.add_uint32(get_tau_announce_event(in.event));
buf.add_uint32(announce_ip);
if (announce_ip && announce_ip->is_ipv4())
{
buf.add_address(*announce_ip);
}
else
{
buf.add_uint32(0U);
}
buf.add_uint32(in.key);
buf.add_uint32(in.numwant);
buf.add_port(in.port);
Expand Down Expand Up @@ -588,9 +598,7 @@ class tr_announcer_udp_impl final : public tr_announcer_udp
}

// Since size of IP field is only 4 bytes long, we can only announce IPv4 addresses
auto const addr = mediator_.announceIP();
uint32_t const announce_ip = addr && addr->is_ipv4() ? addr->addr.addr4.s_addr : 0;
tracker->announces.emplace_back(announce_ip, request, std::move(on_response));
tracker->announces.emplace_back(mediator_.announceIP(), request, std::move(on_response));
tracker->upkeep(false);
}

Expand Down
17 changes: 17 additions & 0 deletions libtransmission/tr-buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include "error.h"
#include "net.h" // tr_socket_t
#include "tr-assert.h"
#include "utils-ev.h"
#include "utils.h" // for tr_htonll(), tr_ntohll()

Expand Down Expand Up @@ -355,6 +356,22 @@ class Buffer
add(&nport, sizeof(nport));
}

void add_address(tr_address const& addr)
{
switch (addr.type)
{
case TR_AF_INET:
add(&addr.addr.addr4.s_addr, sizeof(addr.addr.addr4.s_addr));
break;
case TR_AF_INET6:
add(&addr.addr.addr6.s6_addr, sizeof(addr.addr.addr6.s6_addr));
break;
default:
TR_ASSERT_MSG(false, "invalid type");
break;
}
}

void add_uint8(uint8_t uch)
{
add(&uch, 1);
Expand Down

0 comments on commit 90b86a1

Please sign in to comment.