fixed an issue with database connection exhaustion on errors

This commit is contained in:
its-a-feature
2026-04-10 09:35:59 -05:00
parent 6148c5f0fb
commit ca6d7d2ce0
12 changed files with 29 additions and 2 deletions
+7
View File
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [3.4.33] - 2026-04-10
### Changed
- Fixed an issue where payload/command syncing would error out and leave dangling database connections
- Updated the postgres docker image to use customized database info for health checks
## [3.4.32] - 2026-04-06
### Changed
+1 -1
View File
@@ -1 +1 @@
3.4.32
3.4.33
@@ -251,6 +251,7 @@ func updateC2Parameters(in C2SyncMessage, c2Profile databaseStructs.C2profile) e
logging.LogError(err, "Failed to fetch c2 parameters for c2 profile when syncing")
return err
} else {
defer rows.Close()
for rows.Next() {
found := false
if err = rows.StructScan(&databaseParameter); err != nil {
@@ -78,6 +78,7 @@ func MythicRPCArtifactSearch(input MythicRPCArtifactSearchMessage) MythicRPCArti
response.Error = err.Error()
return response
} else {
defer rows.Close()
for rows.Next() {
result := MythicRPCArtifactSearchArtifactData{}
searchResult := databaseStructs.Taskartifact{}
@@ -66,6 +66,7 @@ func MythicRPCCallbackEdgeSearch(input MythicRPCCallbackEdgeSearchMessage) Mythi
return response
}
searchResults := databaseStructs.Callbackgraphedge{}
defer rows.Close()
for rows.Next() {
result := MythicRPCCallbackEdgeSearchMessageResult{}
err = rows.StructScan(&searchResults)
@@ -181,6 +181,7 @@ func MythicRPCCallbackSearch(input MythicRPCCallbackSearchMessage) MythicRPCCall
response.Error = err.Error()
return response
}
defer rows.Close()
for rows.Next() {
result := MythicRPCCallbackSearchMessageResult{}
err = rows.StructScan(&searchResults)
@@ -137,6 +137,7 @@ func MythicRPCCustomBrowserSearch(input MythicRPCCustomBrowserSearchMessage) Myt
response.Error = err.Error()
return response
}
defer rows.Close()
for rows.Next() {
searchResult := databaseStructs.MythicTree{}
err = rows.StructScan(&searchResult)
@@ -151,6 +151,7 @@ func associateBuildParametersWithPayload(databasePayload databaseStructs.Payload
logging.LogError(err, "Failed to get build parameters from database when trying to build payload")
return nil, err
}
defer rows.Close()
for rows.Next() {
err = rows.StructScan(&databaseBuildParameter)
if err != nil {
@@ -298,6 +299,7 @@ func associateC2ProfilesWithPayload(databasePayload databaseStructs.Payload, c2P
logging.LogError(err, "Failed to get c2 parameters from database when trying to build payload")
return nil, err
}
defer rows.Close()
for rows.Next() {
err = rows.StructScan(&databaseC2ProfileParameter)
if err != nil {
@@ -110,6 +110,7 @@ func MythicRPCProcessSearch(input MythicRPCProcessSearchMessage) MythicRPCProces
response.Error = err.Error()
return response
} else {
defer rows.Close()
for rows.Next() {
searchResult := databaseStructs.MythicTree{}
if err = rows.StructScan(&searchResult); err != nil {
@@ -157,6 +157,7 @@ func updateLoadedCommandsFromPayloadBuild(databasePayload databaseStructs.Payloa
logging.LogError(err, "Failed to get payload commands when trying to update loaded commands for payload build response")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databasePayloadCommand); err != nil {
logging.LogError(err, "Failed to get row from payloadcommand when trying to process payload build response")
@@ -479,6 +479,7 @@ func updatePayloadTypeBuildParameters(in PayloadTypeSyncMessage, payloadtype dat
logging.LogError(err, "Failed to fetch build parameters for payloadtype when syncing")
return err
} else {
defer rows.Close()
for rows.Next() {
found := false
if err = rows.StructScan(&databaseParameter); err != nil {
@@ -624,6 +625,7 @@ func updatePayloadTypeC2Profiles(in PayloadTypeSyncMessage, payloadtype database
logging.LogError(err, "Failed to get payloadtypec2profile from database")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databaseC2Profile); err != nil {
logging.LogError(err, "Failed to get row from payloadtypec2profile")
@@ -684,6 +686,7 @@ func updatePayloadTypeWrappers(in PayloadTypeSyncMessage, payloadtype databaseSt
logging.LogError(err, "Failed to get wrappedpayloadtypes from database")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databaseWrapper); err != nil {
logging.LogError(err, "Failed to get row from wrappedpayloadtypes for importing new payloadtype")
@@ -715,6 +718,7 @@ func updatePayloadTypeWrappers(in PayloadTypeSyncMessage, payloadtype databaseSt
logging.LogError(err, "Failed to get wrappedpayloadtypes from database")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databaseWrapper); err != nil {
logging.LogError(err, "Failed to get row from wrappedpayloadtypes for importing new payloadtype")
@@ -815,6 +819,7 @@ func updatePayloadTypeCommands(in PayloadTypeSyncMessage, payloadtype databaseSt
logging.LogError(err, "Failed to fetch commands for payloadtype when syncing")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databaseCommand); err != nil {
logging.LogError(err, "Failed to parse command into structure when syncing payloadtype")
@@ -981,6 +986,7 @@ func updatePayloadTypeCommandParameters(in PayloadTypeSyncMessage, payloadtype d
logging.LogError(err, "Failed to fetch command parameters for command when syning")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databaseParameter); err != nil {
logging.LogError(err, "Failed to parse commandparameter into structure when syncing command")
@@ -1142,6 +1148,7 @@ func updatePayloadTypeCommandBrowserScripts(in PayloadTypeSyncMessage, syncComma
return err
} else {
found := false
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databaseBrowserScript); err != nil {
logging.LogError(err, "Failed to parse browserscript into structure when syncing command")
@@ -1212,6 +1219,7 @@ func addBrowserScriptToAllOperators(browserscript databaseStructs.Browserscript)
logging.LogError(err, "Failed to get operators")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&operator); err != nil {
logging.LogError(err, "Failed to parse operator into structure")
@@ -1241,6 +1249,7 @@ func updateBrowserScriptForAllOperators(browserscript databaseStructs.Browserscr
logging.LogError(err, "Failed to get operators")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&operatorScript); err != nil {
logging.LogError(err, "Failed to parse browserscript into structure for updating scripts")
@@ -1278,6 +1287,7 @@ func removeBrowserScriptFromAllOperators(browserscript databaseStructs.Browsersc
logging.LogError(err, "Failed to get browserscripts for command", "command", browserscript.CommandID)
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&operatorScript); err != nil {
logging.LogError(err, "Failed to parse operator into structure")
@@ -1307,6 +1317,7 @@ func updatePayloadTypeCommandMitreAttack(in PayloadTypeSyncMessage, syncCommand
logging.LogError(err, "Failed to get attackcommand from database")
return err
} else {
defer rows.Close()
for rows.Next() {
if err = rows.StructScan(&databaseMitreAttack); err != nil {
logging.LogError(err, "Failed to parse mitre att&ck into structure")
+1 -1
View File
@@ -11,7 +11,7 @@ import (
"github.com/spf13/viper"
)
const mythicServerVersion = "3.4.32"
const mythicServerVersion = "3.4.33"
type Config struct {
// server configuration