Bug in vsprintf.c?



  • https://github.com/pipelinedb/pipelinedb/blob/master/src/gis/liblwgeom/vsprintf.c

    Hab da mal eine Frage, wenn ich mit "%.*s" die ersten 5 Zeichen eines unendlich langen Strings ausgeben will, läuft dann das strlen in Zeile 127 ewig?

    Frage nur, weil meine Strings gelegentlich nicht null terminiert sind 😞



  • Unendlich lang gibt's nicht. Nur bis du Pech hast und eventuell einen Segfault verursachst.

    Wegen der Ausgabe nicht-nullterminerter Strings: Klick!

    char*string = "123456";
    fprintf(stderr,"%.*s",3,string); /*Gibt "123" aus*/
    

  • Mod

    dachschaden schrieb:

    Wegen der Ausgabe nicht-nullterminerter Strings: Klick!

    char*string = "123456";
    fprintf(stderr,"%.*s",3,string); /*Gibt "123" aus*/
    

    Das Problem ist doch, dass hier - wenn ich den gezeigten Abschnitt korrekt interpretiere - das strlen aufgerufen wird, selbst wenn man eine Präzision im Formatstring angibt. Genauer gesagt muss man bei nicht-nullterminierten Strings eine Präzision angeben, aber das muss dann laut Standard auch funktionieren. Wenn dies hier tatsächlich fehlschlagen kann, dann wäre das in der Tat ein Fehler in dieser Implementierung.



  • Huch, SeppJ hat recht.
    Eigentlich müsste der Code eine Prüfung machen, ob strtoul != 0 zurückgibt oder ob die Länge von var_arg engelesen wurde (Zeile 80, 83, 90 und 93). Dann darf der 's'-Case kein strlen machen, sondern sich sagen, dass er bereits die Länge bekommen hat.

    Aber da fällt mir noch was anderes auf - die verwenden abs hier. Und mit abs bin ich vorsichtig, seit ich rausgefunden habe, dass im Zweierkompliment auf 32-Bit-Größe abs(0x80000000) == 0x80000000 == -2147483648 ist. Wenn man das auf die totale Größe addiert, verringert sich diese - und so kann ein Angreifer die Implementierung eventuell dazu bringen, weniger Speicher als eigentlich notwendig zu reservieren.


Log in to reply