Moin pl,

else if(getenv("CONTENT_TYPE") && strncmp(getenv("CONTENT_TYPE"), "multipart/form-data", 19) == 0){ unsigned int content_length = getenv("CONTENT_LENGTH") ? atoi(getenv("CONTENT_LENGTH")) : 0;
unsigned char *mem; mem = (char*)malloc(content_length); fread(mem,content_length,1,stdin);
  • Nur der Neugierde halber: Meckert hier nicht der Compiler, weil der Rückgabewert von malloc nur nach char* statt unsigned char* gecastet wird?
  • Und malloc erwartet natürlich die Speichergröße als size_t – ebenso wie fread.
// Boundary in erster Zeile ermitteln unsigned char *offs; // Wanderzeiger Offset int blen = 0; // Boundary Length char *boundary; if( offs = strstr(mem, "\r\n")){ blen = offs - mem;

Die Differenz zweier Pointer ist nicht vom Typ int, sondern ptrdiff_t

boundary = (char*)malloc(blen); memcpy(boundary,mem,blen);

malloc und memcpy erwarten die Längenangabe immer noch als size_t.

/* <snip> */ // Ab hier wird es zyklisch do{ PARAM *pnew = NULL; pnew = malloc(sizeof *pnew); int hlen = 0; // in Header: name, filename, Content-Type char *header; unsigned char *h; // Hilfszeiger if( h = strstr(offs, "\r\n\r\n") ){ // Bis zur Leerzeile hlen = h - offs; header = (char*)malloc(hlen); memcpy(header,offs,hlen);

Siehe oben.

offs = h; if( h = strstr(header,"Content-Type") ){

Sind nicht noch andere Schreibweisen des Content-Type erlaubt? Wie case-sensitive ist denn die Definition hier?

pnew->content_type = (char*)malloc(hlen); sprintf(pnew->content_type,"%s",h+14);

Jedes Mal, wenn ich ein sprintf sehe, ist ja der erste Reflex auf snprintf hinzuweisen, aber wenn ich dann sehe, dass hier lediglich ein String umkopiert wird, warum dann nicht gleich strncpy?

pnew->content_type[hlen] = 0; } else pnew->content_type = ""; if( h = strstr(header, "filename")) { for(int i = 0; i < hlen; i++){ if(h[i] == 34) h[i] = 0;

Direkt das entsprechende Zeichen zwecks Lesbarkeit hinzuschreiben, war wohl zu viel 😉

} pnew->filename= (char*)malloc(hlen); sprintf(pnew->filename,"%s",h+10);

Siehe oben – bis zum Ende dieses if-else-Konstrukts.

int vlen = 0; // Value length, Binary

Das sollte natürlich auch ein ptrdiff_t sein.

unsigned char *b; // Begin Boundary // offs steht am Anfang der Leerzeile !! if( b = bstrstr(offs, content_length, boundary, blen) ){ offs += 4; // 4 bytes vor wegen der Leerzeile

Das wird nicht geprüft, sondern nur vorausgesetzt!

/* Siehe oben */

Viele Grüße
Robert

freiwillige Angabe, für jeden sichtbar
freiwillige Angabe, für jeden sichtbar
freiwillige Angabe, für jeden sichtbar

Vorschau (Nachricht wird im Forum „SELF-Forum“ erscheinen)

  • Keine Tag-Vorschläge verfügbar
  • keine Tags vergeben

abbrechen

068

c binary mode für stdin

  1. 0
    1. 0
    2. 0
      1. 0
        1. 0
          1. 0
        2. 0
          1. 0
            1. 0
              1. 0
                1. 0
      2. 0

        multipart/form-data

        1. 0
          1. 0
            1. 0
            2. 0
              1. 0
                1. 0
        2. 0
        3. 0
          1. 0
            1. 0
              1. 0
          2. 0
            1. 0
              1. 0
              2. 0
                1. 0
                  1. 0
                2. 0
                  1. 0
                    1. 0
                      1. 0
                        1. 0
                          1. -1
                            1. 0
                        2. 0
                3. 2
                  1. 0
                  2. 0
                  3. 0
                    1. 0
                      1. 0
                        1. 0
                        2. 2
                          1. 1
                            1. 0
                    2. 0
                      1. 0
                4. 0
  2. 0

    C Upload goßer Datenmengen

    1. 0
      1. 0
        1. 0
          1. 0
            1. 0
              1. 0
              2. 0

                Bug in PHP PHP/5.3.0 Upload

                1. 0
                  1. 0
                    1. 0
                      1. 0
                        1. 0
            2. 0
            3. 0
    2. 2
      1. 4