Sfoglia il codice sorgente

HPCC-16271 Dafilesrv copyfile exception crash

Signed-off-by: Mark Kelly <mark.kelly@lexisnexis.com>
Mark Kelly 8 anni fa
parent
commit
65d5e37ed7
2 ha cambiato i file con 118 aggiunte e 16 eliminazioni
  1. 95 16
      common/remote/sockfile.cpp
  2. 23 0
      dali/datest/datest.cpp

+ 95 - 16
common/remote/sockfile.cpp

@@ -363,10 +363,89 @@ const char *RFCStrings[] =
     RFCText(RFCsetfileperms),
     RFCText(RFCunknown),
 };
-static const char *getRFCText(RemoteFileCommandType cmd)
+static const char *getRFCText(unsigned cmd)
 {
+    switch (cmd)
+    {
+        case RFSERR_InvalidCommand:
+            return "RFSERR_InvalidCommand";
+        case RFSERR_NullFileIOHandle:
+            return "RFSERR_NullFileIOHandle";
+        case RFSERR_InvalidFileIOHandle:
+            return "RFSERR_InvalidFileIOHandle";
+        case RFSERR_TimeoutFileIOHandle:
+            return "RFSERR_TimeoutFileIOHandle";
+        case RFSERR_OpenFailed:
+            return "RFSERR_OpenFailed";
+        case RFSERR_ReadFailed:
+            return "RFSERR_ReadFailed";
+        case RFSERR_WriteFailed:
+            return "RFSERR_WriteFailed";
+        case RFSERR_RenameFailed:
+            return "RFSERR_RenameFailed";
+        case RFSERR_ExistsFailed:
+            return "RFSERR_ExistsFailed";
+        case RFSERR_RemoveFailed:
+            return "RFSERR_RemoveFailed";
+        case RFSERR_CloseFailed:
+            return "RFSERR_CloseFailed";
+        case RFSERR_IsFileFailed:
+            return "RFSERR_IsFileFailed";
+        case RFSERR_IsDirectoryFailed:
+            return "RFSERR_IsDirectoryFailed";
+        case RFSERR_IsReadOnlyFailed:
+            return "RFSERR_IsReadOnlyFailed";
+        case RFSERR_SetReadOnlyFailed:
+            return "RFSERR_SetReadOnlyFailed";
+        case RFSERR_GetTimeFailed:
+            return "RFSERR_GetTimeFailed";
+        case RFSERR_SetTimeFailed:
+            return "RFSERR_SetTimeFailed";
+        case RFSERR_CreateDirFailed:
+            return "RFSERR_CreateDirFailed";
+        case RFSERR_GetDirFailed:
+            return "RFSERR_GetDirFailed";
+        case RFSERR_GetCrcFailed:
+            return "RFSERR_GetCrcFailed";
+        case RFSERR_MoveFailed:
+            return "RFSERR_MoveFailed";
+        case RFSERR_ExtractBlobElementsFailed:
+            return "RFSERR_ExtractBlobElementsFailed";
+        case RFSERR_CopyFailed:
+            return "RFSERR_CopyFailed";
+        case RFSERR_AppendFailed:
+            return "RFSERR_AppendFailed";
+        case RFSERR_AuthenticateFailed:
+            return "RFSERR_AuthenticateFailed";
+        case RFSERR_CopySectionFailed:
+            return "RFSERR_CopySectionFailed";
+        case RFSERR_TreeCopyFailed:
+            return "RFSERR_TreeCopyFailed";
+        case RAERR_InvalidUsernamePassword:
+            return "RAERR_InvalidUsernamePassword";
+        case RFSERR_MasterSeemsToHaveDied:
+            return "RFSERR_MasterSeemsToHaveDied";
+        case RFSERR_TimeoutWaitSlave:
+            return "RFSERR_TimeoutWaitSlave";
+        case RFSERR_TimeoutWaitConnect:
+            return "RFSERR_TimeoutWaitConnect";
+        case RFSERR_TimeoutWaitMaster:
+            return "RFSERR_TimeoutWaitMaster";
+        case RFSERR_NoConnectSlave:
+            return "RFSERR_NoConnectSlave";
+        case RFSERR_NoConnectSlaveXY:
+            return "RFSERR_NoConnectSlaveXY";
+        case RFSERR_VersionMismatch:
+            return "RFSERR_VersionMismatch";
+        case RFSERR_SetThrottleFailed:
+            return "RFSERR_SetThrottleFailed";
+        case RFSERR_MaxQueueRequests:
+            return "RFSERR_MaxQueueRequests";
+    }
+
     if (cmd > RFCmax)
-        cmd = RFCmax;
+        return "RFSERR_UnknownCmd/Error";
+
     return RFCStrings[cmd];
 }
 
@@ -2885,25 +2964,25 @@ public:
 
 
 
-inline void appendErr(MemoryBuffer &reply, RemoteFileCommandType e)
+inline void appendErr(MemoryBuffer &reply, unsigned e)
 {
-    reply.append((unsigned)e).append(getRFCText(e));
+    reply.append(e).append(getRFCText(e));
 }
-inline void appendErr2(MemoryBuffer &reply, RemoteFileCommandType e, unsigned v)
+inline void appendErr2(MemoryBuffer &reply, unsigned e, unsigned v)
 {
     StringBuffer msg;
     msg.append(getRFCText(e)).append(':').append(v);
-    reply.append((unsigned)e).append(msg.str());
+    reply.append(e).append(msg.str());
 }
-inline void appendErr3(MemoryBuffer &reply, RemoteFileCommandType e, int code, const char *errMsg)
+inline void appendErr3(MemoryBuffer &reply, unsigned e, int code, const char *errMsg)
 {
     StringBuffer msg;
     msg.appendf("ERROR: %s(%d) '%s'", getRFCText(e), code, errMsg?errMsg:"");
     // some errors are RemoteFileCommandType, some are RFSERR_*
     // RFCOpenIO needs remapping to non-zero for client to know its an error
     if ((RemoteFileCommandType)e == RFCopenIO)
-        e = (RemoteFileCommandType)RFSERR_OpenFailed;
-    reply.append((unsigned)e);
+        e = RFSERR_OpenFailed;
+    reply.append(e);
     reply.append(msg.str());
 }
 
@@ -3865,7 +3944,7 @@ public:
         CriticalBlock block(sect);
         fileio = NULL;
         if (handle<=0) {
-            appendErr(reply, (RemoteFileCommandType)RFSERR_NullFileIOHandle);
+            appendErr(reply, RFSERR_NullFileIOHandle);
             return false;
         }
         unsigned clientidx;
@@ -3884,7 +3963,7 @@ public:
             }
             return true;
         }
-        appendErr(reply, (RemoteFileCommandType)RFSERR_InvalidFileIOHandle);
+        appendErr(reply, RFSERR_InvalidFileIOHandle);
         return false;
     }
 
@@ -4035,7 +4114,7 @@ public:
             reply.setWritePos(posOfErr);
             StringBuffer s;
             e->errorMessage(s);
-            appendErr3(reply, (RemoteFileCommandType)RFSERR_ReadFailed,e->errorCode(),s.str());
+            appendErr3(reply, RFSERR_ReadFailed, e->errorCode(), s.str());
             e->Release();
             return false;
         }
@@ -4722,13 +4801,13 @@ public:
     bool cmdKill(MemoryBuffer & msg, MemoryBuffer & reply)
     {
         // TBD
-        appendErr2(reply, (RemoteFileCommandType)RFSERR_InvalidCommand, RFCkill);
+        appendErr2(reply, RFSERR_InvalidCommand, RFCkill);
         return false;
     }
 
     bool cmdUnknown(MemoryBuffer & msg, MemoryBuffer & reply,RemoteFileCommandType cmd)
     {
-        appendErr2(reply, (RemoteFileCommandType)RFSERR_InvalidCommand, cmd);
+        appendErr2(reply, RFSERR_InvalidCommand, cmd);
         return false;
     }
 
@@ -4740,7 +4819,7 @@ public:
             StringBuffer s(client.queryPeerName());
             PROGLOG("Connect from %s",s.str());
         }
-        appendErr2(reply, (RemoteFileCommandType)RFSERR_InvalidCommand, RFCunlock);
+        appendErr2(reply, RFSERR_InvalidCommand, RFCunlock);
         return false;
     }
 
@@ -5123,7 +5202,7 @@ public:
             }
         }
         reply.clear();
-        appendErr(reply, (RemoteFileCommandType)RFSERR_AuthenticateFailed);
+        appendErr(reply, RFSERR_AuthenticateFailed);
         sendBuffer(socket, reply); // send OK
         return false;
     }

+ 23 - 0
dali/datest/datest.cpp

@@ -46,6 +46,7 @@ static unsigned nIter = 1;
 //#define TEST_REMOTEFILE
 //#define TEST_REMOTEFILE2
 //#define TEST_REMOTEFILE3
+//#define TEST_COPYFILE
 //#define TEST_DEADLOCK
 //#define TEST_THREADS
 #define MDELAY 100
@@ -709,6 +710,21 @@ struct RecordStruct
 // #define NRECS ((__int64)1024*1024*500/sizeof(RecordStruct)) // i.e. ~500MB
 // #define NRECS ((__int64)1024*500/sizeof(RecordStruct)) // i.e. ~500KB
 
+void TestCopyFile(char *srcfname, char *dstfname)
+{
+    // example cmdline: datest srcfile //1.2.3.4:7100/home/username/dstfile
+    IFile *srcfile = createIFile(srcfname);
+    IFileIO *srcio = srcfile->open(IFOcreate);
+    char buf[100] = { "TestCopyFile" };
+    srcio->write(0, 18, buf);
+    srcio->close();
+    srcio->Release();
+    IFile *dstfile = createIFile(dstfname);
+    srcfile->copyTo(dstfile,0x100000,NULL,false);
+    srcfile->Release();
+    dstfile->Release();
+}
+
 void TestRemoteFile3(int nfiles, int fsizemb)
 {
     //SocketEndpoint ep("10.150.10.8:7100");
@@ -3081,6 +3097,13 @@ int main(int argc, char* argv[])
         TestRemoteFile3(nfiles, fsizemb);
         return 0;
 #endif
+#if defined(TEST_COPYFILE)
+        if(argc >= 3)
+            TestCopyFile(argv[1], argv[2]);
+        else
+            DBGLOG("TestCopyFile(src-file, dst-file) missing arguments");
+        return 0;
+#endif
         if (argc<2) {
             usage();
             return 1;