lightningd: really do allow two Torv3 addresses.

This surprised me, since the CHANGELOG for [0.8.2] said:

	We now announce multiple addresses of the same type, if given. ([3609](https://github.com/ElementsProject/lightning/pull/3609))

But it lied!

Changelog-Fixed: We really do allow providing multiple addresses of the same type.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2021-11-10 10:57:41 +10:30
committed by Christian Decker
parent 3dcab9793d
commit 9d18180172
5 changed files with 78 additions and 67 deletions

View File

@@ -112,39 +112,6 @@ void towire_u8_array(u8 **pptr UNNEEDED, const u8 *arr UNNEEDED, size_t num UNNE
{ fprintf(stderr, "towire_u8_array called!\n"); abort(); }
/* AUTOGENERATED MOCKS END */
static bool wireaddr_internal_eq(const struct wireaddr_internal *a,
const struct wireaddr_internal *b,
bool cmp_torservice_blob)
{
if (a->itype != b->itype)
return false;
switch (a->itype) {
case ADDR_INTERNAL_SOCKNAME:
return streq(a->u.sockname, b->u.sockname);
case ADDR_INTERNAL_ALLPROTO:
return a->u.port == b->u.port;
case ADDR_INTERNAL_AUTOTOR:
case ADDR_INTERNAL_STATICTOR:
if (!wireaddr_eq(&a->u.torservice.address,
&b->u.torservice.address))
return false;
if (a->u.torservice.port != b->u.torservice.port)
return false;
if (!cmp_torservice_blob)
return true;
return memeq(a->u.torservice.blob, sizeof(a->u.torservice.blob),
b->u.torservice.blob, sizeof(b->u.torservice.blob));
case ADDR_INTERNAL_FORPROXY:
if (!streq(a->u.unresolved.name, b->u.unresolved.name))
return false;
return a->u.unresolved.port == b->u.unresolved.port;
case ADDR_INTERNAL_WIREADDR:
return wireaddr_eq(&a->u.wireaddr, &b->u.wireaddr);
}
abort();
}
int main(int argc, char *argv[])
{
const char *err;
@@ -155,87 +122,98 @@ int main(int argc, char *argv[])
assert(parse_wireaddr_internal("127.0.0.1", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_WIREADDR;
assert(parse_wireaddr("127.0.0.1:9735", &expect->u.wireaddr, 0, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* IPv4 address with port. */
assert(parse_wireaddr_internal("127.0.0.1:1", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_WIREADDR;
assert(parse_wireaddr("127.0.0.1:1", &expect->u.wireaddr, 0, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* Simple IPv6 address. */
assert(parse_wireaddr_internal("::1", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_WIREADDR;
assert(parse_wireaddr("::1", &expect->u.wireaddr, DEFAULT_PORT, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* IPv6 address with port. */
assert(parse_wireaddr_internal("[::1]:1", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_WIREADDR;
assert(parse_wireaddr("::1", &expect->u.wireaddr, 1, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* autotor address */
assert(parse_wireaddr_internal("autotor:127.0.0.1", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_AUTOTOR;
expect->u.torservice.port = DEFAULT_PORT;
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9051, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* autotor address with port */
assert(parse_wireaddr_internal("autotor:127.0.0.1:9055", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_AUTOTOR;
expect->u.torservice.port = DEFAULT_PORT;
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9055, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* autotor address with torport */
assert(parse_wireaddr_internal("autotor:127.0.0.1/torport=9055", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_AUTOTOR;
expect->u.torservice.port = 9055;
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9051, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* autotor address with port and torport */
assert(parse_wireaddr_internal("autotor:127.0.0.1:9055/torport=10055", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_AUTOTOR;
expect->u.torservice.port = 10055;
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9055, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* statictor address */
assert(parse_wireaddr_internal("statictor:127.0.0.1", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_STATICTOR;
expect->u.torservice.port = DEFAULT_PORT;
memset(expect->u.torservice.blob, 0, sizeof(expect->u.torservice.blob));
strcpy((char *)expect->u.torservice.blob, STATIC_TOR_MAGIC_STRING);
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9051, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* statictor address with port */
assert(parse_wireaddr_internal("statictor:127.0.0.1:9055", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_STATICTOR;
expect->u.torservice.port = DEFAULT_PORT;
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9055, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* statictor address with torport */
assert(parse_wireaddr_internal("statictor:127.0.0.1/torport=9055", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_STATICTOR;
expect->u.torservice.port = 9055;
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9051, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* statictor address with port and torport */
assert(parse_wireaddr_internal("statictor:127.0.0.1:9055/torport=10055", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_STATICTOR;
expect->u.torservice.port = 10055;
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9055, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* statictor address with port and torport and torblob */
assert(parse_wireaddr_internal("statictor:127.0.0.1:9055/torport=10055/torblob=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_STATICTOR;
expect->u.torservice.port = 10055;
/* This is actually nul terminated */
memset(expect->u.torservice.blob, 'x', sizeof(expect->u.torservice.blob)-1);
assert(parse_wireaddr("127.0.0.1", &expect->u.torservice.address, 9055, NULL, &err));
assert(wireaddr_internal_eq(&addr, expect));
/* local socket path */
assert(parse_wireaddr_internal("/tmp/foo.sock", &addr, DEFAULT_PORT, false, false, false, false, &err));
expect->itype = ADDR_INTERNAL_SOCKNAME;
strcpy(expect->u.sockname, "/tmp/foo.sock");
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* Unresolved */
assert(!parse_wireaddr_internal("ozlabs.org", &addr, DEFAULT_PORT, false, false, false, false, &err));
@@ -244,7 +222,7 @@ int main(int argc, char *argv[])
expect->itype = ADDR_INTERNAL_FORPROXY;
strcpy(expect->u.unresolved.name, "ozlabs.org");
expect->u.unresolved.port = DEFAULT_PORT;
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
/* Unresolved with port */
assert(!parse_wireaddr_internal("ozlabs.org:1234", &addr, DEFAULT_PORT, false, false, false, false, &err));
@@ -253,7 +231,7 @@ int main(int argc, char *argv[])
expect->itype = ADDR_INTERNAL_FORPROXY;
strcpy(expect->u.unresolved.name, "ozlabs.org");
expect->u.unresolved.port = 1234;
assert(wireaddr_internal_eq(&addr, expect, false));
assert(wireaddr_internal_eq(&addr, expect));
tal_free(expect);
common_shutdown();