Skip to content

expfmt: fix nil pointer panic when parsing empty braces "{}"#922

Merged
roidelapluie merged 1 commit into
prometheus:mainfrom
roidelapluie:roidelapluie/fix-textparse-empty-braces-panic
Jun 12, 2026
Merged

expfmt: fix nil pointer panic when parsing empty braces "{}"#922
roidelapluie merged 1 commit into
prometheus:mainfrom
roidelapluie:roidelapluie/fix-textparse-empty-braces-panic

Conversation

@roidelapluie

Copy link
Copy Markdown
Member

The text exposition parser panics with a nil pointer dereference when it encounters a closing brace before any metric name has been read, e.g. for the input "{}". In startOfLine a leading "{" sets currentMetricIsInsideBraces and jumps straight to label parsing without going through readingMetricName, so currentMF/currentMetric are still nil when startLabelName dereferences currentMetric on the "}" branch.

Since TextToMetricFamilies is used to decode untrusted scrape payloads, a malicious or compromised target could crash any consumer that does not wrap the parser in its own recover().

Guard the "}" branch on currentMF == nil and return a parse error, mirroring the existing guard in startLabelValue. currentMF is checked rather than currentMetric because reset only clears currentMF between parses.

Introduced in #670.

The text exposition parser panics with a nil pointer dereference when it
encounters a closing brace before any metric name has been read, e.g. for
the input "{}". In startOfLine a leading "{" sets currentMetricIsInsideBraces
and jumps straight to label parsing without going through readingMetricName,
so currentMF/currentMetric are still nil when startLabelName dereferences
currentMetric on the "}" branch.

Since TextToMetricFamilies is used to decode untrusted scrape payloads, a
malicious or compromised target could crash any consumer that does not wrap
the parser in its own recover().

Guard the "}" branch on currentMF == nil and return a parse error, mirroring
the existing guard in startLabelValue. currentMF is checked rather than
currentMetric because reset only clears currentMF between parses.

Introduced in prometheus#670.

Signed-off-by: Julien Pivotto <291750+roidelapluie@users.noreply.github.com>
@roidelapluie roidelapluie merged commit 2269d3d into prometheus:main Jun 12, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants