[LLVMdev] Infinite recursion in sys::fs::create_directories()
Michael Spencer
bigcheesegs at gmail.com
Thu Mar 22 14:20:52 PDT 2012
On Thu, Mar 22, 2012 at 2:11 PM, Kal Conley <kcconley at gmail.com> wrote:
> Hi,
>
> sys::fs::create_directories() recurses infinitely for relative paths
> with only one directory or where the first directory in path doesn't
> exist. This was observed in r153176.
>
> Example:
>
> #include <llvm/Support/FileSystem.h>
>
> using namespace llvm;
>
> int main(int argc, char *argv[])
> {
> bool existed;
> error_code ec = sys::fs::create_directories(Twine("log"), existed);
> return 0;
> }
>
> recurses infinitely in sys::fs::create_directories().
>
> This happens because the parent of "log" is "" which doesn't exist so
> the function recurses and looks for the parent or "" which is "" which
> doesn't exist etc. The function should perhaps check if parent is empty.
>
> Here is how I fixed it:
>
> //------------------
>
> error_code create_directories(const Twine &path, bool &existed) {
> SmallString<128> path_storage;
> StringRef p = path.toStringRef(path_storage);
>
> StringRef parent = path::parent_path(p);
> if (!parent.empty()) {
> bool parent_exists;
> if (error_code ec = exists(parent, parent_exists)) return ec;
>
> if (!parent_exists)
> if (error_code ec = create_directories(parent, existed)) return ec;
> }
> return create_directory(p, existed);
> }
>
> //------------------
>
> Thanks,
> Kal
Thanks, fixed in: r153225
- Michael Spencer
More information about the llvm-dev
mailing list