Search code examples
c++builderindytftp

Indy TFTP Server Exception EIdTFTPAllocationExceeded


I am receiving an EIdTFTPAllocationExceeded exception when transferring a file from me (the server - using the Indy TIdTrivialFTPServer component) to a device. I cannot find any information about what that exception might mean except maybe a disk space problem on the client (which I know is not the case because if I transfer the file through a different TFTP server, there is no problem).

  1. What is the exception trying to tell me?
  2. How do I get around it?
  3. Is there any code that I'm missing?

My TFTP Server code (all of it) for the server is:

__fastcall TTrivialFTPServer::TTrivialFTPServer(TComponent* Owner) : TDataModule(Owner)
{
    root = IncludeTrailingPathDelimiter(GetCurrentDir());
}

// ---------------------------------------------------------------------------
void __fastcall TTrivialFTPServer::tftpReadFile(TObject *Sender, UnicodeString &FileName, const TPeerInfo &PeerInfo, bool &GrantAccess, TStream *&AStream, bool &FreeStreamOnComplete)
{
    FreeStreamOnComplete = true;
    FileName = StringReplace(FileName, "/", "\\", TReplaceFlags() << rfReplaceAll);
    FileName = ExtractFileName(FileName);
    if (FileExists(root + "files\\" + FileName, false))
    {
        AStream = new TFileStream(root + "files\\" + FileName, fmOpenRead | fmShareDenyWrite);
        GrantAccess = true;
    }
    else
    {
        GrantAccess = false;
    }
}

Solution

  • After much searching and head scratching, I finally opened the IdTrivialFTPServer.pas file and found the problem. The code states:

    if FBlkCounter = High(UInt16) then begin
        raise EIdTFTPAllocationExceeded.Create('');
    end;
    

    When I added text to the exception I received the added text, so this is where the error is occurring. I tried converting from UInt16 to UInt32, but caused many more problems, so I wanted to see what would happen if I just commented out the check and let the counter roll back to zero.

    As It turns out, nothing at all bad happens and the file transfers just fine!