From bf58c59f3d44fe1ec96d17cc35137f12bbd8dc89 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Wed, 19 Aug 2026 00:13:33 +0200 Subject: [PATCH] Chat : la meme faille SQL existait dans le chat de groupe des bots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le correctif precedent ne visait que le chuchotement, celui que la pile d appel designait. La requete du canal de groupe (ai_talk_group) portait le meme defaut, dans une boucle sur les membres qui plus est : une requete par bot present. Le royaume est retombe cinq minutes apres le premier correctif, sur le meme mot - « c est » - avec la meme erreur 1064. Lecon : chercher toutes les occurrences du motif, pas seulement celle que le crash montre. Retrait au passage de la trace de diagnostic temporaire : le message du fournisseur, remonte au joueur en jeu, suffit desormais. Co-Authored-By: Claude Opus 5 --- src/server/game/Handlers/ChatHandler.cpp | 10 ++++++++-- src/server/game/Mercenary/MercenaryChat.cpp | 8 -------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index e351b48..96ecc5e 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -426,12 +426,18 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, LocaleConstant locale = GetPlayer()->GetSession()->GetSessionDbcLocale(); QueryResult result; + // SylvaniaCore : meme faille que pour le chuchotement, et meme + // consequence - une erreur SQL abat le worldserver. Le message est + // echappe et borne avant de toucher la requete. + std::string safeGroupMsg = msg.size() > 255 ? msg.substr(0, 255) : msg; + WorldDatabase.EscapeString(safeGroupMsg); + // First try locale specific result = WorldDatabase.PQuery( "SELECT `reply` FROM `ai_talk_group_locale` " "WHERE locale = %u AND '%s' REGEXP cname " "ORDER BY RAND() LIMIT 1", - locale, msg.c_str() + locale, safeGroupMsg.c_str() ); // Fallback in English @@ -441,7 +447,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg, "SELECT `reply` FROM `ai_talk_group` " "WHERE '%s' REGEXP cname " "ORDER BY RAND() LIMIT 1", - msg.c_str() + safeGroupMsg.c_str() ); } diff --git a/src/server/game/Mercenary/MercenaryChat.cpp b/src/server/game/Mercenary/MercenaryChat.cpp index d9d6e73..664ef09 100644 --- a/src/server/game/Mercenary/MercenaryChat.cpp +++ b/src/server/game/Mercenary/MercenaryChat.cpp @@ -745,14 +745,6 @@ bool MercenaryChatMgr::Perform(MercenaryChatRequest const& request, std::string& text << "."; error = text.str(); - - // Trace de diagnostic : le corps envoye, jamais l adresse - chez Gemini - // la cle voyage dans l URL. Le refus d un fournisseur porte presque - // toujours sur ce qu on lui a transmis. - TC_LOG_ERROR("server.worldserver", "Mercenaires (dialogue): refus %ld du fournisseur %s. Corps envoye : %s", - httpCode, GetProviderName(request.provider), payload.c_str()); - TC_LOG_ERROR("server.worldserver", "Mercenaires (dialogue): reponse recue : %s", body.c_str()); - return false; }