From 6b0f3cd24301280ac031c6a7b54f2cf71d20d5e0 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 29 Jun 2026 22:45:22 +0530 Subject: [PATCH] fix(crm): rollback before logging in Frappe CRM webhook handlers (Postgres) create_prospect/create_address/create_customer insert docs and on failure call frappe.log_error with no rollback; on Postgres (untrusted external CRM webhook input) a failed insert poisons the txn so log_error raises InFailedSqlTransaction. Full frappe.db.rollback() before each log_error. No-op on MariaDB. --- erpnext/crm/frappe_crm_api.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/crm/frappe_crm_api.py b/erpnext/crm/frappe_crm_api.py index 0230dda7925..9b1b77755a8 100644 --- a/erpnext/crm/frappe_crm_api.py +++ b/erpnext/crm/frappe_crm_api.py @@ -26,6 +26,7 @@ def create_prospect_against_crm_deal(): prospect.insert() prospect_name = prospect.name except Exception: + frappe.db.rollback() frappe.log_error( frappe.get_traceback(), f"Error while creating prospect against CRM Deal: {frappe.form_dict.get('crm_deal_id')}", @@ -97,6 +98,7 @@ def create_address(doctype, docname, address): address.save(ignore_permissions=True) return address.name except Exception: + frappe.db.rollback() frappe.log_error(frappe.get_traceback(), f"Error while creating address for {docname}") @@ -157,6 +159,7 @@ def create_customer(customer_data: dict | None = None): create_address("Customer", customer_name, customer_data.get("address")) return customer_name except Exception: + frappe.db.rollback() frappe.log_error(frappe.get_traceback(), "Error while creating customer against Frappe CRM Deal") pass