*Markus: (C) Dateilängenüberprüfung bei absolutem Pfad fehlerhaft

Hallo,

um keinen Pufferüberlauf zu bekommen überprüfe ich den beim Programmstart in der Form "./programm DATEINAME" übergebenen Namen durch strlen(argv[1]). Ich bemerkte zuerst gar nicht, dass bei absoluten Pfadangaben doch auch der Pfad vor dem Dateinamen als Dateilänge mitgezählt wird. Jetzt könnte ich natürlich den kompletten String durch irgend einen nach Slashes suchenden Stringvergleich wurschteln, wobei die letzten Zeichen nach dem letzten Slash der Dateiname ist, aber gibt es nicht irgend eine praktischere Lösung?

Markus.

--
http://www.apostrophitis.at
Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant vieleicht Strucktur
  1. Hallo Markus,

    um keinen Pufferüberlauf zu bekommen überprüfe ich den beim Programmstart in der Form "./programm DATEINAME" übergebenen Namen durch strlen(argv[1]). Ich bemerkte zuerst gar nicht, dass bei absoluten Pfadangaben doch auch der Pfad vor dem Dateinamen als Dateilänge mitgezählt wird. Jetzt könnte ich natürlich den kompletten String durch irgend einen nach Slashes suchenden Stringvergleich wurschteln, wobei die letzten Zeichen nach dem letzten Slash der Dateiname ist, aber gibt es nicht irgend eine praktischere Lösung?

    Was spricht dagegen, Pufferüberläufe zu vermeiden, indem Du dynamische Puffergrößen (d.h. der Puffer wird so groß gemacht wie er sein muss) verwendest?

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. Hallo,

      Was spricht dagegen, Pufferüberläufe zu vermeiden, indem Du dynamische Puffergrößen (d.h. der Puffer wird so groß gemacht wie er sein muss) verwendest?

      Ja, aber da habe ich wieder das Problem, mit dem ich seit geraumer Zeit  kämpfe. Irgendwie verstricke ich mich immer in dieses Henne-Ei-Problem. Wenn der Puffer eine dynamische Größe haben soll, muss ich doch zuerst wissen, wie groß diese Größe ist? Um das zu erfahren, muss ich doch erst wieder, um auf Nummer Sicher zu gehen, ein überdimensional großes Array definieren um diesen übergebenen String auf die Länge überprüfen zu können.

      Markus.

      --
      http://www.apostrophitis.at
      Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant vieleicht Strucktur
      1. Hallo Markus,

        Ja, aber da habe ich wieder das Problem, mit dem ich seit geraumer Zeit  kämpfe. Irgendwie verstricke ich mich immer in dieses Henne-Ei-Problem. Wenn der Puffer eine dynamische Größe haben soll, muss ich doch zuerst wissen, wie groß diese Größe ist? Um das zu erfahren, muss ich doch erst wieder, um auf Nummer Sicher zu gehen, ein überdimensional großes Array definieren um diesen übergebenen String auf die Länge überprüfen zu können.

        Nein, wieso? Du kannst den Puffer doch im Heap ablegen und dann dynamisch wachsen lassen. Wenn Du's allgemein machen willst: Du kannst Dir doch eine Sturktur erstellen, die 3 Einträge enthält:

        typedef struct {  
          char *inhalt;  
          size_t laenge;  
          size_t puffergroesse;  
        } zeichenkette;
        

        laenge speichert dabei die tatsächliche Stringlänge, puffergroesse speichert, wie viel davon bereits allokiert wurde. Diese Struktur kannst Du dann initialisieren, indem Du inhalt auf NULL setzt, laenge ud puffergroesse auf 0. Wenn Du dann etwas anhängen willst, dann prüfst Du, ob laenge + Länge das Anzuhängenden + 1 (die Eins wegen dem 0-Byte) größer sind als die Puffergröße - wenn ja, nutzt Du realloc(), um den Puffer neu anzulegen mit einer größeren Puffergröße (die mind. so groß ist wie laenge + Länge des Anzuhängenden + 1, Du kannst aber auch um eine bestimmte feste Blockgröße vergrößern - es hängt vom Anwendungsfall ab, was besser geeignet ist), speicherst die neue Puffergröße in Deiner Struktur. Wenn Du damit fertig bist (oder der Puffer vorher schon groß genug war), hängst Du per memcpy() o.ä. den Inhalt des anzufügenden an den Inhalt Deiner Struktur an und erhöhst laenge um die Länge des Angehängten.

        Aber der Aufwand wäre hier doch gar nicht notwendig IMHO. Du hast doch den Pfad schon vorher in einer Variablen - da kannst Du doch die Länge bestimmen und weißt, wie groß Dein Puffer sein soll? Werde mal etwas konkreter, was für ein Puffer bei Dir überlaufen könnte.

        Viele Grüße,
        Christian

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
        1. Hallo,

          Aber der Aufwand wäre hier doch gar nicht notwendig IMHO. Du hast doch den Pfad schon vorher in einer Variablen - da kannst Du doch die Länge bestimmen und weißt, wie groß Dein Puffer sein soll?

          Danke, du hast recht. Offensichtlich sah ich den Wald vor lauter Bäumen nicht mehr. Ein "char filename[strlen(argv[1])];" hat das Problem gelöst, nachdem ich zuerst überprüfen musste, ob überhaupt etwas übergeben wurde, da filename[strlen(argv[1])+1] offensichtlich einen Speicherzugriffsfehler auslöst, sofern man kein Argument übergibt.
          Das mit dem Heap muss ich mir merken :)

          Markus.

          --
          http://www.apostrophitis.at
          Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant vieleicht Strucktur
          1. Sup!

            (...) da filename[strlen(argv[1])+1] offensichtlich einen Speicherzugriffsfehler auslöst, sofern man kein Argument übergibt.

            Mit argc wär' das nicht passiert...

            Gruesse,

            Bio

            --
            Never give up, never surrender!!!
            1. Hallo,

              Mit argc wär' das nicht passiert...

              Stimmt, weswegen ich auch "nachdem ich zuerst überprüfen musste, ob überhaupt etwas übergeben wurde" schrieb.

              Markus.

              --
              http://www.apostrophitis.at
              Maschiene währe Standart Gallerie vorraus Packete Objeckte tollerant vieleicht Strucktur