HIGH: Template rendering bypass in HandleAppCreate/HandleAppUpdate can produce partial HTML #121

Closed
opened 2026-02-21 09:51:51 +01:00 by clawbot · 0 comments
Collaborator

Bug

Several error paths in HandleAppCreate and HandleAppUpdate call tmpl.ExecuteTemplate(writer, ...) directly instead of using h.renderTemplate(writer, tmpl, ...). The renderTemplate method renders into a buffer first and only writes to the ResponseWriter on success, preventing partial/corrupt HTML. The direct calls bypass this safety.

Affected Code

internal/handlers/app.goHandleAppCreate:

nameErr := validateAppName(name)
if nameErr != nil {
    data["Error"] = "Invalid app name: " + nameErr.Error()
    _ = tmpl.ExecuteTemplate(writer, "app_new.html", data) // DIRECT — no buffer
    return
}

internal/handlers/app.goHandleAppUpdate:

nameErr := validateAppName(newName)
if nameErr != nil {
    // ...
    _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer
    return
}

repoURLErr := validateRepoURL(request.FormValue("repo_url"))
if repoURLErr != nil {
    // ...
    _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer
    return
}

Other error paths in the same functions correctly use h.renderTemplate.

Impact

If template execution fails partway through (e.g., missing template data), a partial HTML response is sent to the browser. This is unlikely in practice but violates the safety invariant that renderTemplate was specifically designed to enforce.

Fix

Replace all tmpl.ExecuteTemplate(writer, ...) calls with h.renderTemplate(writer, tmpl, ...).

## Bug Several error paths in `HandleAppCreate` and `HandleAppUpdate` call `tmpl.ExecuteTemplate(writer, ...)` directly instead of using `h.renderTemplate(writer, tmpl, ...)`. The `renderTemplate` method renders into a buffer first and only writes to the ResponseWriter on success, preventing partial/corrupt HTML. The direct calls bypass this safety. ## Affected Code **`internal/handlers/app.go` — `HandleAppCreate`:** ```go nameErr := validateAppName(name) if nameErr != nil { data["Error"] = "Invalid app name: " + nameErr.Error() _ = tmpl.ExecuteTemplate(writer, "app_new.html", data) // DIRECT — no buffer return } ``` **`internal/handlers/app.go` — `HandleAppUpdate`:** ```go nameErr := validateAppName(newName) if nameErr != nil { // ... _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer return } repoURLErr := validateRepoURL(request.FormValue("repo_url")) if repoURLErr != nil { // ... _ = tmpl.ExecuteTemplate(writer, "app_edit.html", data) // DIRECT — no buffer return } ``` Other error paths in the same functions correctly use `h.renderTemplate`. ## Impact If template execution fails partway through (e.g., missing template data), a partial HTML response is sent to the browser. This is unlikely in practice but violates the safety invariant that `renderTemplate` was specifically designed to enforce. ## Fix Replace all `tmpl.ExecuteTemplate(writer, ...)` calls with `h.renderTemplate(writer, tmpl, ...)`.
sneak closed this issue 2026-02-26 11:52:55 +01:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sneak/upaas#121