Replace readdir_r() with readdir() because of stack overflow
authorHyunbin Lee <hyunbin.lee@samsung.com>
Thu, 20 Jun 2013 09:37:31 +0000 (18:37 +0900)
committerHyunbin Lee <hyunbin.lee@samsung.com>
Thu, 20 Jun 2013 11:40:36 +0000 (20:40 +0900)
Change-Id: I73496cdc18795dc677d6501d31ac5c0218f23dfe
Signed-off-by: Hyunbin Lee <hyunbin.lee@samsung.com>
src/io/FIo_DirEnumeratorImpl.cpp

index 2d2f151..d3b50fa 100644 (file)
@@ -114,71 +114,49 @@ _DirEnumeratorImpl::GetCurrent(void) const
 result
 _DirEnumeratorImpl::MoveNext(void)
 {
-       result r = E_SUCCESS;
-       struct dirent dirEnt;
-       struct dirent* pDirEntResult = null;
-       struct stat64 statbuf;
-       struct tm* pTm = null;
-       DateTime dateTime;
-       int ret = 0;
-       String dirEntryPath;
-       bool hidden = false;
-       char* pDirEntryName = null;
-
        SysTryReturnResult(NID_IO, __validAccess == true, E_ILLEGAL_ACCESS,
                        "Given path cannot be accessed!");
        SysTryReturnResult(NID_IO, __absoluteDirPath.GetLength() > 0 && __absoluteDirPath.GetLength() <= PATH_MAX,
                        E_INVALID_ARG, "Invalid argument was passed. Given pattern length is not correct!");
+       result r = E_SUCCESS;
 
-       unique_ptr<char[]> pAbsDirPath(_StringConverter::CopyToCharArrayN(String(__absoluteDirPath)));
-       SysTryReturn(NID_IO, (pAbsDirPath != null), GetLastResult(), GetLastResult(),
+       unique_ptr<char[]> pDirPath(_StringConverter::CopyToCharArrayN(String(__absoluteDirPath)));
+       SysTryReturn(NID_IO, pDirPath != null, GetLastResult(), GetLastResult(),
                        "[%s] Invalid argument was passed. Given pattern length is not correct!", GetErrorMessage(GetLastResult()));
 
        if (__pFileFindInfo == null)
        {
-               __pFileFindInfo = opendir(pAbsDirPath.get());
+               __pFileFindInfo = opendir(pDirPath.get());
                if (__pFileFindInfo == null)
                {
                        r = _NativeError::ConvertNativeErrorToResult(errno, true);
                        SysLog(NID_IO, "[%s] Failed to open directory (%s), [%s].", GetErrorMessage(r),
-                                               GetErrorMessage((result) E_FILE_NOT_FOUND), pAbsDirPath.get());
+                                               GetErrorMessage((result) E_FILE_NOT_FOUND), pDirPath.get());
                        return r;
                }
        }
 
-//SKIP_DIR:
-       // move to next entry in the directory
        errno = 0;
-       ret = readdir_r((DIR*) __pFileFindInfo, &dirEnt, &pDirEntResult);
-       SysTryReturn(NID_IO, (ret == 0), __ConvertNativeErrorToResult(errno),
-                       __ConvertNativeErrorToResult(errno), "[%s] Failed to read next dir entry.", __ConvertNativeErrorToMessage(errno));
+       struct dirent* pDirEnt = readdir((DIR*) __pFileFindInfo);
+       SysTryReturnResult(NID_IO, errno == 0, __ConvertNativeErrorToResult(errno),
+                       "Failed to the next directory entry. path: %s, errno: %d (%s)", pDirPath.get(), errno, strerror(errno));
+       SysTryReturnResult(NID_IO, pDirEnt != null, E_END_OF_FILE, "End of directory entries");
 
-       if (pDirEntResult == null)
-       {
-               return E_END_OF_FILE; // Complete reading the directory
-       }
+       char entryPath[PATH_MAX] = { 0, };
+       strcpy(entryPath, pDirPath.get());
+       strncat(entryPath, "/", 1);
+       strncat(entryPath, pDirEnt->d_name, strlen(pDirEnt->d_name));
 
-       //if (dirEnt.d_name[0] == '.')
-       //{
-       //      goto SKIP_DIR;
-       //}
-
-       // prepare entry path
-       dirEntryPath.Append(__absoluteDirPath);
-       dirEntryPath.Append(L"/");
-       dirEntryPath.Append(dirEnt.d_name);
-       unique_ptr<char[]> pAbsDirEntryPath(_StringConverter::CopyToCharArrayN(dirEntryPath));
-       SysTryReturn(NID_IO, (pAbsDirEntryPath != null), GetLastResult(), GetLastResult(),
-                       "[%s] Invalid argument was passed. Given pattern length is not correct!", GetErrorMessage(GetLastResult()));
-
-       // get its details
-       ret = stat64(pAbsDirEntryPath.get(), &statbuf);
-       SysSecureTryReturn(NID_IO, (ret == 0), r = __ConvertNativeErrorToResult(errno), __ConvertNativeErrorToResult(errno),
-                       "[%s] Failed to get attributes for dir entry (%s) whose absolute dirpath is (%s)with errno [%d].",
-                       __ConvertNativeErrorToMessage(errno), dirEnt.d_name, pAbsDirPath.get(), errno);
+       struct stat64 statbuf;
+       int ret = stat64(entryPath, &statbuf);
+       SysSecureTryReturnResult(NID_IO, ret == 0, r = __ConvertNativeErrorToResult(errno),
+                       "[%s] Failed to get attributes for directory entry (%s), errno: %d (%s)",
+                       entryPath, errno, strerror(errno));
 
-       pTm = localtime(&statbuf.st_mtime);
+       struct tm* pTm = localtime(&statbuf.st_mtime);
        SysTryReturnResult(NID_IO, pTm != null, E_SYSTEM, "Failed to call localtime() (%s).", strerror(errno));
+
+       DateTime dateTime;
        r = dateTime.SetValue(_BASE_YEAR + pTm->tm_year, 1 + pTm->tm_mon, pTm->tm_mday, pTm->tm_hour, pTm->tm_min, pTm->tm_sec);
        SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
 
@@ -189,15 +167,14 @@ _DirEnumeratorImpl::MoveNext(void)
                                   "DirEntry allocation failed.");
        }
 
-       pDirEntryName = &dirEnt.d_name[0];
-
        // check for a hidden file/directory including . and ..
-       if (dirEnt.d_name[0] == '.')
+       bool hidden = false;
+       if (pDirEnt->d_name[0] == '.')
        {
                hidden = true;
        }
 
-       _DirEntryImpl::GetInstance(__pCurDirEntry)->Set(dateTime, statbuf.st_size, String(dirEnt.d_name),
+       _DirEntryImpl::GetInstance(__pCurDirEntry)->Set(dateTime, statbuf.st_size, String(pDirEnt->d_name),
                        S_ISDIR(statbuf.st_mode), (statbuf.st_mode & S_IWUSR) ? false : true, hidden);
 
        return E_SUCCESS;