Speicher allokieren Problem



  • Nabend zusammen,

    ich hab hier was ganz komisches.

    ich schreib euch erstmal den code:

    req->headerSend		= (char*) malloc( sizeof(char*) * strlen(headerSend));
    
    req = Instanz von HttpRequest
    

    So, wenn headerSend nur eine kleine größe hat, dann funktioniert das alles ohne Probleme, wenn ich dort aber einen größeren String übergebe, hat er ein Problem beim reservieren des Speichers und stürzt mit einer unbehandelten Außnahme ab.

    Warum macht er das? *Wein*



  • MSS-Software schrieb:

    So, wenn headerSend nur eine kleine größe hat, dann funktioniert das alles ohne Probleme, wenn ich dort aber einen größeren String übergebe, hat er ein Problem beim reservieren des Speichers und stürzt mit einer unbehandelten Außnahme ab.

    wie gross wird denn das sizeof(char) * strlen(headerSend)?
    und wieso multiplizierst du mit sizeof(char
    )? brauchst du soviele char*, oder meinst du eher einzelne zeichen?
    btw: den type-cast vor 'malloc' kannst du weglassen.
    🙂



  • hi

    es ist eine größe von: 20244

    den typecast kann ich leider nicht weglassen, weil ich im VS arbeite 😉



  • MSS-Software schrieb:

    es ist eine größe von: 20244

    sollte auf PC's eigentlich problemlos gehen. der wurm ist wohl wo anders drin. lass es mal im debugger laufen (der von VS ist spitze).

    MSS-Software schrieb:

    den typecast kann ich leider nicht weglassen, weil ich im VS arbeite 😉

    doch, du musste deine source-files einfach von xxx.cpp in xxx.c umbenennen und - schwupps - versteht VS richtigen C code.
    🙂



  • hi

    genau das hab ich ja schon gemacht. dadurch weiß ich ja, dass dort das Problem ist.

    Genauere Informationen bekomme ich leider nicht. Ich kann nur noch den Dissasembly anzeigen lassen.

    Aber das bringt mich ja nicht weiter



  • zeig mal den code drumherum.



  • hier ist jetzt die komplette methode

    Zeile 123 ist die "Problemzeile"

    int Request::SendHTTP(LPCSTR url,LPCSTR headerReceive,BYTE *post,
            DWORD postLength,HTTPRequest *req)
    {
        WSADATA			WsaData;
        SOCKADDR_IN		sin;
        SOCKET			sock;
        char			buffer[512];
        char			protocol[20],host[256],request[1024];
        int				l,port,chars,err;
        MemBuffer		headersBuffer,messageBuffer;
    	char			headerSend[1024];
        BOOL			done;
    
        ParseURL(url,protocol,sizeof(protocol),host,sizeof(host),		// Parse the URL
            request,sizeof(request),&port);
        if(strcmp(protocol,"HTTP"))
            return 1;
    
        err = WSAStartup (0x0101, &WsaData);							// Init Winsock
        if(err!=0)
            return 1;
    
        sock = socket (AF_INET, SOCK_STREAM, 0);
        //if (socket == INVALID_SOCKET)
    	if (sock == INVALID_SOCKET)
            return 1;
    
        sin.sin_family = AF_INET;										//Connect to web sever
        sin.sin_port = htons( (unsigned short)port );
        sin.sin_addr.s_addr = GetHostAddress(host);
    
        if( connect (sock,(LPSOCKADDR)&sin, sizeof(SOCKADDR_IN) ) )
    	{
    
            return 1;
    	}
    
    	//printf("\r\n\r\n <<SEND   HTTP   REQUEST  : >> \r\n\r\n");		 //Send request
    
        if( !*request )
            lstrcpyn(request,"/",sizeof(request));
    
        if( post == NULL )
    	{
            SendString(sock,"GET ");
    		strcpy(headerSend, "GET ");
    	}
        else 
    	{
    		SendString(sock,"POST ");
    		strcpy(headerSend, "POST ");
    	}
        SendString(sock,request);
    		strcat(headerSend, request);
    
        SendString(sock," HTTP/1.0\r\n");
    		strcat(headerSend, " HTTP/1.0\r\n");
    
        SendString(sock,"Accept: image/gif, image/x-xbitmap,"
            " image/jpeg, image/pjpeg, application/vnd.ms-excel,"
            " application/msword, application/vnd.ms-powerpoint,"
            " */*\r\n");
    		strcat(headerSend, "Accept: image/gif, image/x-xbitmap,"
            " image/jpeg, image/pjpeg, application/vnd.ms-excel,"
            " application/msword, application/vnd.ms-powerpoint,"
            " */*\r\n");
    
        SendString(sock,"Accept-Language: en-us\r\n");
    		strcat(headerSend, "Accept-Language: en-us\r\n");
    
        SendString(sock,"Accept-Encoding: gzip, deflate\r\n");
    		strcat(headerSend, "Accept-Encoding: gzip, deflate\r\n");
    
        SendString(sock,"User-Agent: Mozilla/4.0\r\n");
    		strcat(headerSend, "User-Agent: Mozilla/4.0\r\n");
    
        if(postLength)
        {
            wsprintf(buffer,"Content-Length: %ld\r\n",postLength);
            SendString(sock,buffer);
    		strcat(headerSend, buffer);
        }
    	//SendString(sock,"Cookie: mycookie=blablabla\r\n");
    	//	printf("Cookie: mycookie=blablabla\r\n");
        SendString(sock,"Host: ");
    		strcat(headerSend, "Host: ");
    
        SendString(sock,host);
    		strcat(headerSend, host);
    
        SendString(sock,"\r\n");
    		strcat(headerSend, "\r\n");
    
        if( (headerReceive!=NULL) && *headerReceive )
    	{
            SendString(sock,headerReceive);
    		strcat(headerSend, headerReceive);
    	}
    
        SendString(sock,"\r\n");								// Send a blank line to signal end of HTTP headerReceive
    		strcat(headerSend, "\r\n");
    
        if( (post!=NULL) && postLength )
    	{
            send(sock,(const char*)post,postLength,0);
    		post[postLength]	= '\0';
    
    		strcat(headerSend, (const char*)post);
    	}
        //hier
    	//strcpy(req->headerSend, headerSend);
    
    	ULONGLONG ausgabe = sizeof(char*) * strlen(headerSend);
    
    	req->headerSend		= (char*) malloc( sizeof(char*) * strlen(headerSend));
    
    	strcpy(req->headerSend, (char*) headerSend );
    //	req->headerSend		= (char*)* headerSend ;
    
    //	free(req->headerSend);
    
        // Read the result
    	//printf("\r\n\r\n <<RECEIVE   HTTP   REQUEST  : >> \r\n\r\n\r\n");	// First read HTTP headerReceive
    
        MemBufferCreate(&headersBuffer );
        chars = 0;
        done = FALSE;
    
        while(!done)
        {
            l = recv(sock,buffer,1,0);
            if(l<0)
                done=TRUE;
    
            switch(*buffer)
            {
                case '\r':
                    break;
                case '\n':
                    if(chars==0)
                        done = TRUE;
                    chars=0;
                    break;
                default:
                    chars++;
                    break;
            }
    
            MemBufferAddByte(&headersBuffer,*buffer);
        }
    
        req->headerReceive	= (char*) headersBuffer.buffer;
        *(headersBuffer.position) = 0;
    
        MemBufferCreate(&messageBuffer);							// Now read the HTTP body
    
        do
        {
            l = recv(sock,buffer,sizeof(buffer)-1,0);
            if(l<0)
                break;
            *(buffer+l)=0;
            MemBufferAddBuffer(&messageBuffer, (unsigned char*)&buffer, l);
        } while(l>0);
        *messageBuffer.position = 0;
        req->message = (char*) messageBuffer.buffer;
        req->messageLength = (messageBuffer.position - messageBuffer.buffer);
    
        closesocket(sock);											// Cleanup
    
        return 0;
    }
    


  • das problem ist wohl eher die zeile 11. da legst du ein statisches array für 1024 zeichen an und belegst es hinter deutlich über seine grenzen hinweg, nämlich mit 20224 zeichen. mich wundert ehrlich gesagt eher, dass der code nicht viel früher krachen geht. könnte aber daran liegen, dass du vorher nicht an den stackgrenzen angekommen bist.

    edit nachtrag: ich dachte undertaker hätte es schon erklärt. das:

    ULONGLONG ausgabe = sizeof(char*) * strlen(headerSend); 
    
         req->headerSend = (char*) malloc( sizeof(char*)*strlen(headerSend));
    

    ist mit ziemlicher sicherheit nicht das, was du willst. so sähe es richtig aus:

    ULONGLONG ausgabe = sizeof(char) * (strlen(headerSend)+1); //strlen liefert die länge ohne \0 
                       //und du willst keine menge von zeigern auf char sondern von char
    
         req->headerSend        = (char*) malloc( sizeof(char)*(strlen(headerSend)+1));
    


  • ja sicher

    sicher, das kann ja dann auch nur knallen

    stimmt, da hab ich gar net mehr dran gedacht.

    gut, dann kann ich ja sicherlich die sache mit dem array dynamisch machen gell?



  • ghorst schrieb:

    so sähe es richtig aus:

    ULONGLONG ausgabe = sizeof(char) * (strlen(headerSend)+1); //strlen liefert die länge ohne \0 
                       //und du willst keine menge von zeigern auf char sondern von char
     
         req->headerSend        = (char*) malloc( sizeof(char)*(strlen(headerSend)+1));
    

    und noch die sizeof(char)'s weg machen, denn malnehmen mit 1 bringt selten was 😉


Anmelden zum Antworten