mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
lightningd: fix error packet we send due to permanent error.
tal_strdup() doesn't set tal_count(), so we end up sending an ERROR packet with an empty message. Wrap this and get it right. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -119,6 +119,15 @@ void peer_fail_permanent(struct peer *peer, const u8 *msg)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void peer_fail_permanent_str(struct peer *peer, const char *str TAKES)
|
||||||
|
{
|
||||||
|
/* Don't use tal_strdup, since we need tal_len */
|
||||||
|
u8 *msg = tal_dup_arr(peer, u8, (const u8 *)str, strlen(str) + 1, 0);
|
||||||
|
if (taken(str))
|
||||||
|
tal_free(str);
|
||||||
|
peer_fail_permanent(peer, take(msg));
|
||||||
|
}
|
||||||
|
|
||||||
void peer_internal_error(struct peer *peer, const char *fmt, ...)
|
void peer_internal_error(struct peer *peer, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@@ -129,8 +138,7 @@ void peer_internal_error(struct peer *peer, const char *fmt, ...)
|
|||||||
logv_add(peer->log, fmt, ap);
|
logv_add(peer->log, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
peer_fail_permanent(peer,
|
peer_fail_permanent_str(peer, "Internal error");
|
||||||
take((u8 *)tal_strdup(peer, "Internal error")));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void peer_fail_transient(struct peer *peer, const char *fmt, ...)
|
void peer_fail_transient(struct peer *peer, const char *fmt, ...)
|
||||||
@@ -1090,9 +1098,9 @@ static int peer_got_shutdown(struct peer *peer, const u8 *msg)
|
|||||||
* is not one of those forms. */
|
* is not one of those forms. */
|
||||||
if (!is_p2pkh(scriptpubkey) && !is_p2sh(scriptpubkey)
|
if (!is_p2pkh(scriptpubkey) && !is_p2sh(scriptpubkey)
|
||||||
&& !is_p2wpkh(scriptpubkey) && !is_p2wsh(scriptpubkey)) {
|
&& !is_p2wpkh(scriptpubkey) && !is_p2wsh(scriptpubkey)) {
|
||||||
u8 *msg = (u8 *)tal_fmt(peer, "Bad shutdown scriptpubkey %s",
|
char *str = tal_fmt(peer, "Bad shutdown scriptpubkey %s",
|
||||||
tal_hex(peer, scriptpubkey));
|
tal_hex(peer, scriptpubkey));
|
||||||
peer_fail_permanent(peer, take(msg));
|
peer_fail_permanent_str(peer, take(str));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1148,7 +1156,9 @@ static int channeld_got_bad_message(struct peer *peer, const u8 *msg)
|
|||||||
/* Don't try to fail this (again!) when owner dies. */
|
/* Don't try to fail this (again!) when owner dies. */
|
||||||
peer->owner = NULL;
|
peer->owner = NULL;
|
||||||
if (!fromwire_channel_peer_bad_message(peer, NULL, NULL, &err))
|
if (!fromwire_channel_peer_bad_message(peer, NULL, NULL, &err))
|
||||||
err = (u8 *)tal_strdup(peer, "Internal error after bad message");
|
peer_fail_permanent_str(peer,
|
||||||
|
"Internal error after bad message");
|
||||||
|
else
|
||||||
peer_fail_permanent(peer, take(err));
|
peer_fail_permanent(peer, take(err));
|
||||||
|
|
||||||
/* Kill daemon (though it's dying anyway) */
|
/* Kill daemon (though it's dying anyway) */
|
||||||
@@ -1162,7 +1172,9 @@ static int closingd_got_bad_message(struct peer *peer, const u8 *msg)
|
|||||||
/* Don't try to fail this (again!) when owner dies. */
|
/* Don't try to fail this (again!) when owner dies. */
|
||||||
peer->owner = NULL;
|
peer->owner = NULL;
|
||||||
if (!fromwire_closing_peer_bad_message(peer, NULL, NULL, &err))
|
if (!fromwire_closing_peer_bad_message(peer, NULL, NULL, &err))
|
||||||
err = (u8 *)tal_strdup(peer, "Internal error after bad message");
|
peer_fail_permanent_str(peer,
|
||||||
|
"Internal error after bad message");
|
||||||
|
else
|
||||||
peer_fail_permanent(peer, take(err));
|
peer_fail_permanent(peer, take(err));
|
||||||
|
|
||||||
/* Kill daemon (though it's dying anyway) */
|
/* Kill daemon (though it's dying anyway) */
|
||||||
@@ -1861,7 +1873,7 @@ void peer_fundee_open(struct peer *peer, const u8 *from_peer,
|
|||||||
wire_type_name(fromwire_peektype(from_peer)));
|
wire_type_name(fromwire_peektype(from_peer)));
|
||||||
log_unusual(peer->log, "Strange message to exit gossip: %u",
|
log_unusual(peer->log, "Strange message to exit gossip: %u",
|
||||||
fromwire_peektype(from_peer));
|
fromwire_peektype(from_peer));
|
||||||
peer_fail_permanent(peer, (u8 *)take(msg));
|
peer_fail_permanent_str(peer, take(msg));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1907,8 +1919,7 @@ void peer_fundee_open(struct peer *peer, const u8 *from_peer,
|
|||||||
|
|
||||||
/* Careful here! Their message could push us overlength! */
|
/* Careful here! Their message could push us overlength! */
|
||||||
if (tal_len(msg) >= 65536) {
|
if (tal_len(msg) >= 65536) {
|
||||||
char *err = tal_strdup(peer, "Unacceptably long open_channel");
|
peer_fail_permanent_str(peer, "Unacceptably long open_channel");
|
||||||
peer_fail_permanent(peer, (u8 *)take(err));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
subd_req(peer, peer->owner, take(msg), -1, 2,
|
subd_req(peer, peer->owner, take(msg), -1, 2,
|
||||||
|
|||||||
Reference in New Issue
Block a user