Explorar el Código

HPCC-20034 recursiveCreateDirectory with empty dir caused exception

Regression introduced by HPCC-19233.

Signed-off-by: Jake Smith <jake.smith@lexisnexisrisk.com>
Jake Smith hace 7 años
padre
commit
c090b46060
Se han modificado 4 ficheros con 16 adiciones y 14 borrados
  1. 4 3
      dali/sasha/sasha.cpp
  2. 1 2
      roxie/ccd/ccdfile.cpp
  3. 10 8
      system/jlib/jfile.cpp
  4. 1 1
      system/jlib/jfile.hpp

+ 4 - 3
dali/sasha/sasha.cpp

@@ -405,10 +405,11 @@ int main(int argc, char* argv[])
 
     EnableSEHtoExceptionMapping();
     Thread::setDefaultStackSize(0x10000);
-    startMPServer(0);
-    attachStandardFileLogMsgMonitor("sasha.log", NULL, MSGFIELD_STANDARD, MSGAUD_all, MSGCLS_all, TopDetail, false, true);
-    queryStderrLogMsgHandler()->setMessageFields(MSGFIELD_prefix);
     try {
+        startMPServer(0);
+        attachStandardFileLogMsgMonitor("sasha.log", NULL, MSGFIELD_STANDARD, MSGAUD_all, MSGCLS_all, TopDetail, false, true);
+        queryStderrLogMsgHandler()->setMessageFields(MSGFIELD_prefix);
+
         SocketEndpoint ep;
         Owned<ISashaCommand> cmd = createCommand(argc,argv,ep);
         if (cmd.get()) {

+ 1 - 2
roxie/ccd/ccdfile.cpp

@@ -755,8 +755,7 @@ class CRoxieFileCache : implements IRoxieFileCache, implements ICopyFileProgress
             StringBuffer prevTempFile;
             splitFilename(targetFilename, &destPath, &destPath, &prevTempFile, &prevTempFile);
             prevTempFile.append("*.$$$");
-            Owned<IFile> dirf = createIFile(destPath.str());
-            Owned<IDirectoryIterator> iter = dirf->directoryFiles(prevTempFile.str(),false,false);
+            Owned<IDirectoryIterator> iter = createDirectoryIterator(destPath, prevTempFile, false, false);
             ForEach(*iter)
             {
                 OwnedIFile thisFile = createIFile(iter->query().queryFilename());

+ 10 - 8
system/jlib/jfile.cpp

@@ -3527,16 +3527,16 @@ public:
 };
 
 
-IDirectoryIterator * createDirectoryIterator(const char * path, const char * mask)
+IDirectoryIterator * createDirectoryIterator(const char * path, const char * mask, bool sub, bool includedirs)
 {
     if (mask&&!*mask)   // only NULL is wild
         return new CNullDirectoryIterator;
     if (!path || !*path) // cur directory so no point in checking for remote etc.
-        return new CWindowsDirectoryIterator(path, mask,false,true);
+        return new CWindowsDirectoryIterator(path, mask,sub,includedirs);
     OwnedIFile iFile = createIFile(path);
     if (!iFile||(iFile->isDirectory()!=foundYes))
         return new CNullDirectoryIterator;
-    return iFile->directoryFiles(mask, false, true);
+    return iFile->directoryFiles(mask, sub, includedirs);
 }
 
 IDirectoryIterator *CFile::directoryFiles(const char *mask,bool sub,bool includedirs)
@@ -3716,16 +3716,16 @@ public:
 
 };
 
-IDirectoryIterator * createDirectoryIterator(const char * path, const char * mask)
+IDirectoryIterator * createDirectoryIterator(const char * path, const char * mask, bool sub, bool includedirs)
 {
     if (mask&&!*mask)   // only NULL is wild
         return new CNullDirectoryIterator;
     if (!path || !*path) // no point in checking for remote etc.
-        return new CLinuxDirectoryIterator(path, mask,false,true);
+        return new CLinuxDirectoryIterator(path, mask,sub,includedirs);
     OwnedIFile iFile = createIFile(path);
     if (!iFile||(iFile->isDirectory()!=foundYes))
         return new CNullDirectoryIterator;
-    return iFile->directoryFiles(mask, false, true);
+    return iFile->directoryFiles(mask, sub, includedirs);
 }
 
 IDirectoryIterator *CFile::directoryFiles(const char *mask,bool sub,bool includedirs)
@@ -4049,6 +4049,8 @@ void setDefaultUser(const char * username,const char *password)
 bool recursiveCreateDirectory(const char * path)
 {
     Owned<IFile> file = createIFile(path);
+    if (!file)
+        return false;
     return file->createDirectory();
 }
 
@@ -4097,8 +4099,8 @@ size32_t DirectBufferIO::write(offset_t pos, size32_t len, const void * data)
 
 IFile * createIFile(const char * filename)
 {
-    if (!filename)
-        return NULL;
+    if (isEmptyString(filename))
+        return new CFile(""); // this is in effect a null implementation
     IFile *ret = createContainedIFileByHook(filename);
     if (ret)
         return ret;

+ 1 - 1
system/jlib/jfile.hpp

@@ -268,7 +268,7 @@ extern jlib_decl void createHardLink(const char* fileName, const char* existingF
 extern jlib_decl IFile * createIFile(const char * filename);
 extern jlib_decl IFile * createIFile(MemoryBuffer & buffer);
 extern jlib_decl IFileIO * createIFileIO(HANDLE handle,IFOmode=IFOreadwrite,IFEflags extraFlags=IFEnone);
-extern jlib_decl IDirectoryIterator * createDirectoryIterator(const char * path = NULL, const char * wildcard = NULL);
+extern jlib_decl IDirectoryIterator * createDirectoryIterator(const char * path = NULL, const char * wildcard = NULL, bool sub = false, bool includedirs = true);
 extern jlib_decl IDirectoryIterator * createNullDirectoryIterator();
 extern jlib_decl IFileIO * createIORange(IFileIO * file, offset_t header, offset_t length);     // restricts input/output to a section of a file.