Wie Boundary Checking machen bei vsnprintf?



  • Hallo

    Ich möchte variable argumente, meine Frage ist, wenn ich den Inhalt via vsnprintf in einen anderen buffer kopieren möchte, wie überprüfe ich die länge?

    Hier ein beispiel:

    int funktion(char *buf, ...)
    {
      va_list argps;
      va_start(argps, buf);
      int length = strlen(buf);
      char *tmpbuf = malloc(length+1);
    
      vsnprintf(tmpbuf, length, buf, argps);
      return_code = unterfunktion(tmpbuf, length);
      va_end(argps);
    
      free(tmpbuf);
      return return_code;
    }
    

    Mach ich das komplett falsch? 😞

    merci für eure antworten

    Danke



  • Keine Idee?



  • man: vsnprintf() liefert als Rückgabewert die Anzahl der geschriebenen Bytes/Zeichen zurück - wenn der Wert gleich der übergebenen Länge ist, gab's einen Überlauf. Aber die kann um einiges länger sein als der Formatstring (int's benötigen je nach Größe 1 bis 10 Byte im Text, Strings potentiell unbegrenzt Platz - die nötigen Formatkennungen benötigen nur 2 Byte im Formatstring).



  • Das heisst es gibt nicht eine sinnvolle Variante um sicherzustellen, dass es keine Speicherverletzung gibt?


Anmelden zum Antworten