diff --git a/common/onionreply.c b/common/onionreply.c index 445b5e2ea..8c9bb9f69 100644 --- a/common/onionreply.c +++ b/common/onionreply.c @@ -12,8 +12,8 @@ struct onionreply *fromwire_onionreply(const tal_t *ctx, const u8 **cursor, size_t *max) { struct onionreply *r = tal(ctx, struct onionreply); - r->contents = tal_arr(r, u8, fromwire_u16(cursor, max)); - fromwire_u8_array(cursor, max, r->contents, tal_count(r->contents)); + r->contents = fromwire_tal_arrn(r, cursor, max, + fromwire_u16(cursor, max)); if (!*cursor) return tal_free(r); return r; diff --git a/devtools/print_wire.c b/devtools/print_wire.c index 64e395ca6..a5e11148f 100644 --- a/devtools/print_wire.c +++ b/devtools/print_wire.c @@ -104,10 +104,9 @@ static void printwire_addresses(const u8 **cursor, size_t *plen, size_t len) static void printwire_encoded_short_ids(const u8 **cursor, size_t *plen, size_t len) { struct short_channel_id *scids; - u8 *arr = tal_arr(tmpctx, u8, len); + u8 *arr = fromwire_tal_arrn(tmpctx, cursor, plen, len); - fromwire_u8_array(cursor, plen, arr, len); - if (!*cursor) + if (!arr) return; printf("["); diff --git a/lightningd/gossip_msg.c b/lightningd/gossip_msg.c index 9b000f666..d29adbe56 100644 --- a/lightningd/gossip_msg.c +++ b/lightningd/gossip_msg.c @@ -21,8 +21,7 @@ struct gossip_getnodes_entry *fromwire_gossip_getnodes_entry(const tal_t *ctx, } flen = fromwire_u16(pptr, max); - entry->features = tal_arr(entry, u8, flen); - fromwire_u8_array(pptr, max, entry->features, flen); + entry->features = fromwire_tal_arrn(entry, pptr, max, flen); numaddresses = fromwire_u8(pptr, max); diff --git a/wire/fromwire.c b/wire/fromwire.c index 80a6babfb..e18075749 100644 --- a/wire/fromwire.c +++ b/wire/fromwire.c @@ -308,6 +308,19 @@ void fromwire_u8_array(const u8 **cursor, size_t *max, u8 *arr, size_t num) fromwire(cursor, max, arr, num); } +u8 *fromwire_tal_arrn(const tal_t *ctx, + const u8 **cursor, size_t *max, size_t num) +{ + u8 *arr; + if (num > *max) { + fromwire_fail(cursor, max); + return NULL; + } + arr = tal_arr(ctx, u8, num); + fromwire_u8_array(cursor, max, arr, num); + return arr; +} + void fromwire_pad(const u8 **cursor, size_t *max, size_t num) { fromwire(cursor, max, NULL, num); @@ -393,20 +406,19 @@ struct bitcoin_tx_output *fromwire_bitcoin_tx_output(const tal_t *ctx, struct bitcoin_tx_output *output = tal(ctx, struct bitcoin_tx_output); output->amount = fromwire_amount_sat(cursor, max); u16 script_len = fromwire_u16(cursor, max); - output->script = tal_arr(output, u8, script_len); - fromwire_u8_array(cursor, max, output->script, script_len); + output->script = fromwire_tal_arrn(output, cursor, max, script_len); + if (!*cursor) + return tal_free(output); return output; } struct witscript *fromwire_witscript(const tal_t *ctx, const u8 **cursor, size_t *max) { - struct witscript *retval; + struct witscript *retval = tal(ctx, struct witscript); u16 len = fromwire_u16(cursor, max); - if (!len) - return NULL; - retval = tal(ctx, struct witscript); - retval->ptr = tal_arr(retval, u8, len); - fromwire_u8_array(cursor, max, retval->ptr, len); + retval->ptr = fromwire_tal_arrn(retval, cursor, max, len); + if (!*cursor) + return tal_free(retval); return retval; } diff --git a/wire/wire.h b/wire/wire.h index db383c308..ea380a937 100644 --- a/wire/wire.h +++ b/wire/wire.h @@ -136,6 +136,8 @@ struct amount_sat fromwire_amount_sat(const u8 **cursor, size_t *max); void fromwire_pad(const u8 **cursor, size_t *max, size_t num); void fromwire_u8_array(const u8 **cursor, size_t *max, u8 *arr, size_t num); +u8 *fromwire_tal_arrn(const tal_t *ctx, + const u8 **cursor, size_t *max, size_t num); char *fromwire_wirestring(const tal_t *ctx, const u8 **cursor, size_t *max); struct bitcoin_tx *fromwire_bitcoin_tx(const tal_t *ctx, const u8 **cursor, size_t *max);