Archived Forum Post

Index of archived forum posts

Question:

SFTP Upload not failing when upload failed via Quota limit

Oct 24 '12 at 20:37

i am uploading a file using SFTP (SSH File Transfer Protocol). Using ActiveX the code is similar to:

//Open the file on the server for overwriting
handle = sftp.OpenFile(path, 'writeOnly', 'createTruncate');
if (handle = '') then
   throw new Exception();

//  Upload from the local file to the SSH server.
success = sftp.WriteFileBytes(handle, fileData);
if (success <> 1) then
   throw new Exception();

//Close the file.
success = sftp.CloseHandle(handle);
if (success <> 1) then
    throw new Exception();

This code all works fine and correct; even throwing an error if i don't have permission to overwrite the existing file. But when my account's Quota limit is exceeded, the upload appears to complete without error, but the file isn't actually accepted.

If i perform the same action manually using an SSTP client, i get the errors:

Cannot close remote file 'MyTestFile.dat'.

Permission denied.
Error code: 3
Error message from server (en): Permission denied
Request code: 4

If i upload a small enough file (or make some room on the server) the upload completes fine.

What terrifies me is that Chilkat doesn't give any error that the upload failed; either during the initial WriteFileBytes or during CloseHandle. The documentation for CloseHandle says that 1 indicates success:

function CloseHandle(handle: WideString): Integer;

Closes a file on the SSH/SFTP server. handle is a file handle returned from a previous call to OpenFile.
Returns 1 for success, 0 for failure.


i wondered if maybe it was a bug in WriteFileBytes, and that using something more like what WinSCP does, a file transfer, rather than writing bytes, would fix it. So i changed from

//  Upload from the local file to the SSH server.
success = sftp.WriteFileBytes(handle, fileData);

and first save the data to a temporary file, and call:

//  Upload from the local file to the SSH server.
success = sftp.UploadFile(handle, tempFile);

But the result is the same; no error.

i see in the verbose LastErrorText log when calling CloseHandle:

  packetType: SSH_FXP_STATUS    
  StatusResponseFromServer:     
    Request: FXP_CLOSE  
    InformationReceivedFromServer:  
      StatusCode: 3     
      StatusMessage: Permission denied  
    --InformationReceivedFromServer     
  --StatusResponseFromServer

So what i need is the fact that the upload failed.

The problem, of course, is that the local site will assume the transfer went fine. In reality the transfer failed. And government auditors don't care about technical reasons; they just issue fines for failing to comply with the law.


Edit:

  CloseHandle:  
    DllDate: Aug  5 2012    
    UnlockPrefix: JAMIEBSSH     
    Username: FS44:Avatar   
    Architecture: Little Endian; 32-bit     
    Language: ActiveX   
    VerboseLogging: 1   
    SshVersion: SSH-2.0-0   
    SftpVersion: 3  
    handle: 00000000    
    closeHandle:    
      handle: 00000000  
      sendPacket:   
        packetType: SSH_FXP_CLOSE   
        sendMessage: CHANNEL_DATA   
      --sendPacket  
      Sent FXP_CLOSE    
      loopIdx: 1    
      readChannelData_2:    
        readChannelData: chan=0; tmOutMs=0; checkQ=1; onlyExt=0; skipExt=1; idleTmOutMs=0; bOneRaw=0    
        genRead_1:  
          packetLen: 60     
          mType: CHANNEL_DATA   
          payload: msgType=94; len=49   
        --genRead_1     
      --readChannelData_2   
      packetType: SSH_FXP_STATUS    
      StatusResponseFromServer:     
        Request: FXP_CLOSE  
        InformationReceivedFromServer:  
          StatusCode: 3     
          StatusMessage: Permission denied  
        --InformationReceivedFromServer     
      --StatusResponseFromServer    
    --closeHandle   
    Success.    
  --CloseHandle `enter code here`

Accepted Answer

Thanks! It sounds to me like the call to WriteFileBytes succeeds, meaning that the server accepts the data and there's no way for the client to tell that anything is amiss (or will be amiss). However, the CloseHandle method definitely failed, and CloseHandle should have returned a failed status of 0.

I found and fixed the problem in CloseHandle. Here is a new build: http://www.chilkatsoft.com/preRelease/ChilkatSsh.zip