Jump to content

Jacek Laskowski

Members
  • Content Count

    267
  • Joined

  • Last visited

  • Days Won

    2

Posts posted by Jacek Laskowski


  1. Bug exist in System.Net.HttpClient.Win.pas file. This is not exactly REST Library like I wrote previous, but REST uses this subsystem too.

     

    Bad function with my changes:

     

    function ReadHeader(ARequest: HINTERNET; AHeaderFlag: DWORD; const AHeaderName: string = ''): string;
    var
      LSize: Cardinal;
      LFlags: DWORD;
      LHeaderName: PWideChar;
    begin
      LFLags := AHeaderFlag;
      if AHeaderName <> '' then
      begin
        LFLags := LFLags or WINHTTP_QUERY_CUSTOM;
        LHeaderName := PWideChar(AHeaderName);
      end
      else
        LHeaderName := WINHTTP_HEADER_NAME_BY_INDEX;
    
      LSize := 0;
      WinHttpQueryHeaders(ARequest, LFLags, LHeaderName, nil, LSize, WINHTTP_NO_HEADER_INDEX);
    
      if GetLastError = ERROR_WINHTTP_HEADER_NOT_FOUND then
        Result := ''
      else
      begin
        if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
          raise ENetHTTPException.CreateResFmt(@SNetHttpHeadersError, [GetLastError, SysErrorMessage(GetLastError, TWinHttpLib.Handle)]);
    
        SetLength(Result, LSize div SizeOf(Char) - 1);
        
        // ----------------------  my changes begin
        if Length(Result) = 0 then
        begin
          SetLength(Result, 1);
        end;
        // ---------------------- my changes end
        
        if WinHttpQueryHeaders(ARequest, LFLags, LHeaderName, PChar(Result), LSize, WINHTTP_NO_HEADER_INDEX) = False then
          raise ENetHTTPException.CreateResFmt(@SNetHttpHeadersError, [GetLastError, SysErrorMessage(GetLastError, TWinHttpLib.Handle)]);
      end;
    end;

    The problem occurs when a zero-length string (SetLength) is created and passed by the PChar to the WinHttpQueryHeaders() method as Nil.

     

    SetLength(Result, LSize div SizeOf(Char) - 1);  //when LSize = 2 then Result is empty string

     

     

    I can't reproduce this case now, because I don't have access to that site that caused the error on the hackathon, and on a few other ones that I checked right now, this situation doesn't occur (the header row with 2 characters).

     

    • Like 1

  2. The REST Library in Delphi Rio has a serious error. I was last weekend at the world's largest HackYeah hackathon, where I needed to use the Delphi Rio to connect to the rest service. However, I could not. REST Debbuger did not return any error or response after calling the request (button Send Request). I lost a lot of time on the verification of network connections and the operation of the server itself (I thought that a heavy load on the hackatone participants "killed" the server) but it turned out to be a mistake in the REST Library. When I tried to call the request directly from Delphi (request.Execute ()) I got an error in KERNELBASE. There is no error in Delphi Tokyo, the same code worked there, but on my laptop I only had Rio. So I was looking for a solution. Eventually, I found the place and the reason, corrected RTL file (after copy to project directory) and the code runed, but the bad taste remained.

    Later I will publish where the error lies.

    • Like 1

  3. Based on this thread:

     

    https://stackoverflow.com/questions/29958168/are-integer-reads-atomic-in-delphi

     

    it can be assumed that writing or reading Integer values (4 bytes) does not have to be atomic. It depends on the alignment.
    Questions:
    Is writing and reading 1 byte (type Byte) always atomic (and safe) operation?

    Is writing and reading 2 byte (type Word) always atomic (and safe) operation?

×