bitcoin/short_channel_id: short_channel_id_from_str accepts trailing garbage, negative numbers, and whitespace

Offen Anfängerfreundlich
#9,700 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 2 Tagen

@bhuvan-somisetty arbeitet bereits daran.

Seit 05.11.2026.

  • #9701 von @bhuvan-somisetty — offen

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
83/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
c

Rechercherichtung

Beginne mit short_channel_id_from_str() in bitcoin/short_channel_id.c und verfolge short_channel_id_dir_from_str(), das die Verarbeitung an diese Funktion delegiert. Prüfe, wie der aktuelle Parser mit den angegebenen ungültigen Beispielen umgeht, und stelle dann sicher, dass das Parsen fehlerhafte Eingaben zurückweist und das angegebene Dezimalformat mit drei Komponenten akzeptiert. Fertig ist die Aufgabe, wenn Beispiele mit nachgestellten Zeichen, negativen Werten, Vorzeichen oder Leerraum zurückgewiesen werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Issue and Steps to Reproduce

short_channel_id_from_str() in bitcoin/short_channel_id.c parses short channel ID strings using sscanf:

bool short_channel_id_from_str(const char *str, size_t strlen,
			       struct short_channel_id *dst)
{
	u32 blocknum, txnum;
	u16 outnum;

	if (sscanf(str, "%ux%ux%hu", &blocknum, &txnum, &outnum) == 3)
		return mk_short_channel_id(dst, blocknum, txnum, outnum);
	return false;
}

This implementation allows several invalid string formats to succeed:

  1. Trailing garbage / unparsed characters: sscanf does not check if the entire buffer length (strlen) is consumed. Strings such as "1x2x3garbage", "1x2x3/0", "1x2x3x4", or "1x2x3 4" successfully return true with valid dst filled from the initial match.
  2. Negative outnums: %hu accepts negative numbers (e.g. "-1"), parsing them as 65535 ((u16)-1). In mk_short_channel_id(), (outnum & 0xFFFF) != outnum evaluates to 65535 != 65535 which is false, so "1x2x-1" is accepted as valid channel output 65535.
  3. Leading / internal whitespace and signs: sscanf skips whitespace before numeric conversions and parses leading + signs, allowing strings like " 1x2x3", "1x 2x3", or "+1x2x3".
  4. short_channel_id_dir_from_str pollution: Because short_channel_id_dir_from_str delegates to short_channel_id_from_str(str, slash - str, ...), strings like "1x2x3garbage/0" are also parsed without error.
Steps to reproduce:
struct short_channel_id scid;
assert(short_channel_id_from_str("1x2x3garbage", strlen("1x2x3garbage"), &scid) == false); // Fails (returns true)
assert(short_channel_id_from_str("1x2x-1", strlen("1x2x-1"), &scid) == false);             // Fails (returns true)
Expected behavior:

Per BOLT 7, a short channel ID is uniquely represented by three decimal components delimited by 'x': <blocknum>x<txnum>x<outnum>. short_channel_id_from_str() should strictly parse the entire provided string and reject trailing garbage, negative values, signs, and whitespace.

getinfo output

N/A (observed in bitcoin/short_channel_id.c across all CLN versions).

Vorherrschende Sprache
C
Sterne
3.1k
Forks
1k
Ø Merge
4 T. 21 Std.
Gemergte PRs (30 T.)
21

Entwicklungsumgebung

  • Enthält ein Dockerfile oder eine Docker-Compose-Datei
  • Hat eine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus ElementsProject/lightning

Alle Issues in ElementsProject/lightning

Ähnliche Issues

Weitere Issues zu C

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.