Announcement

Collapse
No announcement yet.

"Out of memory" Problem / Speicherverwaltung bei DLL's

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "Out of memory" Problem / Speicherverwaltung bei DLL's

    Hallo,
    In unserer ISAPI Application haben wir den enctype geaendert um die Moeglichkeit des Datei Upload einzubauen.
    Fuer das neue Handling des TWRequest habe ich einen Parser gebaut der sich den Request anschaut und der beim auftreten eine File Dowloads ein eigene Routine dafuer startet.
    Nun habe ich in unseren Logfiles festgestellt dass es immer wieder zu "Out of Memory" Problemen kommt. Ich habe diesen Fehler noch nie selbst erlebt, da er unvorhersehbar mehrmals am Tag auftreten kann (oder auch nicht :-( ).
    Wir verwenden IIS 6.0, Delphi 7.0, MS 2003 Server und haben ca. 1500 Zugriffe/Tag.
    Vielleicht sieht einer von euch ja die wahrscheinlich offene Schwachstelle...
    Aber ich befuerchte ich muss mich tiefer in die Speicherverwaltung von IIS einarbeiten und den Fehler zu lokalisieren :-(

    Code:
    function Test.GetWebrequestContent(Request : TWebRequest) : TStrings; 
    const
        BufferSize = 8192;
    var
        TotalBytes, ExtraBytes, ExtraBytesRead, BytesRead : Integer;
        pBuffer, pExtBuffer, pFreeBuff : PChar;
        ContentStrm : TMemoryStream; //Request.Content will be written to it!
        l, p: Word;
        Boundary, ContentType: String;
    
    begin
        TRY
            //Boundary
            l := length(Request.ContentType);
            p := Pos('boundary=', Request.ContentType) + 9;
            Boundary := copy(Request.ContentType, p, l);
    
            //ContentType
            ContentType := copy(Request.ContentType, 1, p - 12);
    
            // Total Size of content (even oversized > 48 KByte)
            TotalBytes := Request.ContentLength;
    
            //Is Form Data available?
            if TotalBytes > 0 then
            begin
                GetMem(pBuffer, TotalBytes + 2);
                pBuffer^ := Char(0);
                pFreeBuff := pBuffer; //6.6.6
    
                ContentStrm := TMemoryStream.Create;
    
                TRY
                    BytesRead := TISAPIRequest(Request).ECB.cbAvailable; 
                    pBuffer := TISAPIRequest(Request).ECB.lpbData;       
                    ContentStrm.Write(pBuffer^, BytesRead);              
                    ExtraBytes := TotalBytes - BytesRead;                
    
                    if ExtraBytes > 0  then                              
                    begin
                        GetMem(pExtBuffer, ExtraBytes + 2);
                        pExtBuffer^ := Chr(0);
    
                        repeat  
                            ExtraBytesRead := Request.ReadClient(pExtBuffer^, BufferSize);
                            ContentStrm.Write(pExtBuffer^, ExtraBytesRead);               
                            Inc(BytesRead, ExtraBytesRead);
                        until ((BytesRead = Request.ContentLength) OR (ExtraBytesRead <= 0)); 
    
                    end;
    
                    //Now lets parse the content for the form fields entries and transform then into TString (except the attached files) (private external function)
                    Result := ParseWebRequest(ContentStrm, Boundary); 
    
                FINALLY
                    ContentStrm.Free;
                    if pFreeBuff <> NIL then   
                        FreeMem(pFreeBuff, TotalBytes + 2);
                    If pExtBuffer <> NIL then  //6.6.6
                        FreeMem(pExtBuffer, ExtraBytes + 2);
                END;
    
            end
            else
                result := Request.ContentFields;
        EXCEPT
            on E : Exception do
            begin
                writeErrorline('FH10', 'Error in ParseWebRequestContent. ContentFields: ' + Request.Contentfields.GetText + ' Reason: ' + E.Message + '|' + IntToStr(E.HelpContext));
            end;
        END;
    end;
    Ich bin fuer jede Hilfe Dankbar.
    LG Niels
    Zuletzt editiert von Niels14; 14.06.2007, 06:16.
Working...
X