Sicheres vsprintf
-
Hallo zusammen,
für eine Routine in meiner MySQL-Klasse suche ich eine sichere Methode, um die Argumente zu vervollständigen. Zur Zeit sieht die Funktion folgendermassen aus :
//Sendet ein Statement ohne Rueckgabewert an den Server const bool CMySQL::Statement(const char *szQuery, ...) { char szQueryTemp[MAXSQLSTATELENGTH]; va_list cpArg; //Die Anfrage wird vervollstaendigt va_start (cpArg, szQuery); vsprintf (szQueryTemp, szQuery, cpArg); va_end (cpArg); mysql_real_query(m_hMySQL, szQueryTemp, strlen(szQueryTemp)); if (mysql_errno(m_hMySQL) == 0) return true; else return false; }Ich habe genau dann ein Problem, wenn die komplette Anfrage länger als MAXSQLSTATELENGTH wird. Leider ist mir kein Weg bekannt, wie ich dieses bereits im vorfeld prüfen kann.
Sollte dieser Fall eintreten, dass verabschiedet sich die Anwendung sang- und klanglos.Weiss jemand einen Rat, wie man diesem Umstand beseitigen kann ?
Viele Grüße
-
Schau dir mal vsnprintf an:
int Length = vsnprintf(Buffer, BUFFER_LENGTH, , pArg); // Hab nicht alle Parameter im Kopf, waren aber 4) if(Length == -1) Buffer[BUFFER_LENGTH - 1] = '\0'; else Buffer[Length] = '\0';
-
schauMal schrieb:
Schau dir mal vsnprintf an:
p]Hallo !
Danke für Deine Antwort. Laut MSDN verhält sich das mit vsnprintf so :
int _vsnprintf( char *buffer, size_t count, const char *format, va_list argptr );Ist das nicht irgendwie das gleiche in Grün ? Wenn die Anfrage mit dem Argumenten länger als count bzw *buffer wird ?
Gibt es eventuell eine Möglichkeit dieses mittels STL zu bewerkstelligen ? Die Klasse string von WxWidgtes gibt sowas her glaub ich, aber hier verwende ich kein MFC, wxWidgets oder ähnliches.
-
Setz doch einfach count von vsnprintf auf Deine Maximallänge

-
LordJaxom schrieb:
Setz doch einfach count von vsnprintf auf Deine Maximallänge

Das mache ich ja jetzt auch schon, aber ich weiss ja nicht immer, wielang die Anfrage Tatsächlich wird. Wenn das zusammensetzen des string länger wird als mein MAXCOUNT, dann habe ich ein Problem.
Das ist jetzt noch eine kleine Anfrage, aber es geht noch länger :
lpMySQL->Statement("INSERT INTO t_NumberSet (nNumberID, nNumber, sNameID, sIDName, \ sNumberFormat) VALUES ('%d', '%d', '%s', '%s', '%s')", GUTSCHRIFT, 0, "GS", "Gutschrift", "%%y%%m%04d");
-
Der Sinn von count ist eben dass die Anfrage nicht länger wird. vsnprintf schneidet dann ab. Wenn er keine Auswirkung hätte bräuchte ich den count nicht

vsnprintf gibt auch zurück, wieviele Zeichen tatsächlich erzeugt wurden. Wenn der Wert == count ist weisst Du, dass nicht alles gepasst hat.
-
Ahh...Ich höre die Groschen fallen
Das ist jedenfalls ein Schritt in die richtige Richtung. Dynamische Vergösserung und Vermeidung einer MAXCOUNT Angabe wären mir zwar lieber, aber so verhindere ich schonmal einen AppCrash und das ist schonmal eine Menge wert.Vielen Dank für die Hilfe.
-
warum benutzt du nicht einfach std::strings? die wissen, wie groß sie sind.
-
Das würde ich gerne, aber es mangelt am Wissen. Ich suche ja eine Methode die ich mit string bewältigen kann.