@@ -388,6 +388,18 @@ static const char *decode_f(struct bolt11 *b11,
388
388
size_t orig_len = * field_len ;
389
389
const char * err ;
390
390
391
+ /* Read version but don't commit to hash yet */
392
+ err = pull_uint (NULL , & orig_data , & orig_len , & version , 5 , false);
393
+ if (err )
394
+ return tal_fmt (b11 , "f: %s" , err );
395
+
396
+ bool is_known_version = version == 17 || version == 18 || version < 17 ;
397
+
398
+ if (!is_known_version ) {
399
+ return unknown_field (b11 , hu5 , data , field_len , 'f' );
400
+ }
401
+
402
+ /* For known versions, process with hash */
391
403
err = pull_uint (hu5 , data , field_len , & version , 5 , false);
392
404
if (err )
393
405
return tal_fmt (b11 , "f: %s" , err );
@@ -442,13 +454,9 @@ static const char *decode_f(struct bolt11 *b11,
442
454
fallback = scriptpubkey_witness_raw (b11 , version ,
443
455
f , tal_count (f ));
444
456
} else {
445
- /* BOLT #11:
446
- * - MUST skip over `f` fields that use an unknown `version`.
447
- */
448
- /* Restore version for unknown field! */
449
- * data = orig_data ;
450
- * field_len = orig_len ;
451
- return unknown_field (b11 , hu5 , data , field_len , 'f' );
457
+ // This should be unreachable because all valid versions (17, 18, or <17)
458
+ // and invalid versions are caught above.
459
+ return tal_fmt (b11 , "f: unknown version %" PRIu64 , version );
452
460
}
453
461
454
462
if (b11 -> fallbacks == NULL )
0 commit comments