You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Hovering an Errors cell passes build-log text to ImGui.SetTooltip as a printf format, so an error containing "%s" crashes the app #348
BuildMonitor/BuildMonitor.cs:1405 calls ImGui.SetTooltip(errorSummary) and :1475 calls ImGui.SetTooltip(tooltip) (built from provider.StatusMessage, which carries exception text). In Hexa.NET.ImGui the SetTooltip(string) overload is SetTooltip(string fmt), forwarded to native igSetTooltip(const char* fmt, ...) with no varargs. The string is therefore interpreted as a printf format.
Failure scenario
A failing run whose job log has an ##[error] line containing format specifiers, for example:
GCC -Werror=format: error: format '%s' expects argument of type 'char *'
MSBuild/Exec errors quoting batch variables: '%SIGNTOOL%' is not recognized…
ParseLogForErrors copies the line into run.Errors verbatim. When the user hovers the Errors cell, vsnprintf reads arguments that were never passed: %s/%S dereference a junk pointer (native access violation that terminates the process; no managed exception to catch), %d/%x print garbage. A provider exception message containing % hits the same path via the status tooltip.
Every other text output in the app already uses TextUnformatted; these two call sites are the exception.
Priority: High. Untrusted build-log text is passed to native igSetTooltip as a printf format string. Hovering the Errors cell of a run whose error text contains %s, which is common with GCC -Werror=format or %VAR% batch errors, causes a native access violation. That kills the process with no managed exception to catch. The trigger is ordinary user action on real-world data, and the fix is two lines.
Area / suggested assignment:BuildMonitor/BuildMonitor.cs at ~L1405 and ~L1475. Replace each call with BeginTooltip/TextUnformatted/EndTooltip. It is worth grepping the other ImGui apps in the org (ProjectDirector, ImageGui, Schema.Editor and others) for SetTooltip( with dynamic text, since the same pattern may exist there.
Activity
matt-edmondson commentedon Oct 7, 2026
Triage
igSetTooltipas a printf format string. Hovering the Errors cell of a run whose error text contains%s, which is common with GCC-Werror=formator%VAR%batch errors, causes a native access violation. That kills the process with no managed exception to catch. The trigger is ordinary user action on real-world data, and the fix is two lines.BuildMonitor/BuildMonitor.csat ~L1405 and ~L1475. Replace each call withBeginTooltip/TextUnformatted/EndTooltip. It is worth grepping the other ImGui apps in the org (ProjectDirector, ImageGui, Schema.Editor and others) forSetTooltip(with dynamic text, since the same pattern may exist there.Generated by Claude Code