diff --git a/src/lua/fio.lua b/src/lua/fio.lua index 321ae8b2d591add4bbea92e629631e2414428a91..cb224f3d0fb366ffbd8dcc0f5251e02481e478d2 100644 --- a/src/lua/fio.lua +++ b/src/lua/fio.lua @@ -4,6 +4,7 @@ local fio = require('fio') local ffi = require('ffi') local buffer = require('buffer') local fiber = require('fiber') +local errno = require('errno') ffi.cdef[[ int umask(int mask); @@ -360,12 +361,16 @@ fio.mktree = function(path, mode) local current_dir = "/" for i, dir in ipairs(dirs) do current_dir = fio.pathjoin(current_dir, dir) - if not fio.stat(current_dir) then + local stat = fio.stat(current_dir) + if stat == nil then local st, err = fio.mkdir(current_dir, mode) if err ~= nil then return false, string.format("Error creating directory %s: %s", current_dir, tostring(err)) end + elseif not stat:is_dir() then + return false, string.format("Error creating directory %s: %s", + current_dir, errno.strerror(errno.EEXIST)) end end return true diff --git a/test/app/fio.result b/test/app/fio.result index 34f58d6bc8f2be77eeb075d71f3d47e8032d51a6..f83c43f4403320d3b56b17f11a3c3d7368400096 100644 --- a/test/app/fio.result +++ b/test/app/fio.result @@ -1443,3 +1443,16 @@ test_run:cmd("clear filter") --- - true ... +-- +-- gh-4439: mktree error handling fix - creation of existing file/directory +-- +fio.mktree('/dev/null') +--- +- false +- 'Error creating directory /dev/null: File exists' +... +fio.mktree('/dev/null/dir') +--- +- false +- 'Error creating directory /dev/null: File exists' +... diff --git a/test/app/fio.test.lua b/test/app/fio.test.lua index be735e4f338390f3460869650e19ac7b470c7040..56c957d8a00b25111f9426638e63b8f347bfbfba 100644 --- a/test/app/fio.test.lua +++ b/test/app/fio.test.lua @@ -468,3 +468,9 @@ fio.rmtree(1) fio.copytree(nil, nil) fio.copytree(nil, nil) test_run:cmd("clear filter") + +-- +-- gh-4439: mktree error handling fix - creation of existing file/directory +-- +fio.mktree('/dev/null') +fio.mktree('/dev/null/dir')