From a1b1525ec1887be4d338f51c2cb1f9a5d3e79c9c Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Mon, 12 Jun 2017 16:02:11 +0200 Subject: [PATCH] lx_fs: handle errors on mkdir correctly Fixes #2444 --- repos/base-linux/run/lx_fs.run | 14 +++++++------- repos/libports/src/test/libc_ffat/main.cc | 2 +- repos/os/src/server/lx_fs/directory.h | 12 ++++++++++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/repos/base-linux/run/lx_fs.run b/repos/base-linux/run/lx_fs.run index ca329f1406..b681e4bc28 100644 --- a/repos/base-linux/run/lx_fs.run +++ b/repos/base-linux/run/lx_fs.run @@ -31,7 +31,8 @@ install_config { - + + @@ -39,12 +40,11 @@ install_config { - - - - - - + + + + + diff --git a/repos/libports/src/test/libc_ffat/main.cc b/repos/libports/src/test/libc_ffat/main.cc index def23f5ac2..5fb7a26495 100644 --- a/repos/libports/src/test/libc_ffat/main.cc +++ b/repos/libports/src/test/libc_ffat/main.cc @@ -120,7 +120,7 @@ static void test(Genode::Xml_node node) CALL_AND_CHECK(ret, mkdir(dir_name, 0777), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", dir_name); /* try to create again */ - CALL_AND_CHECK(ret, mkdir(dir_name, 0777), ((ret == 0) || (errno == EEXIST)), "dir_name=%s", dir_name); + CALL_AND_CHECK(ret, mkdir(dir_name, 0777), (errno == EEXIST), "dir_name=%s", dir_name); /* change to new directory */ CALL_AND_CHECK(ret, chdir(dir_name), ret == 0, "dir_name=%s", dir_name); diff --git a/repos/os/src/server/lx_fs/directory.h b/repos/os/src/server/lx_fs/directory.h index c9c2bf7a72..5ae4172b75 100644 --- a/repos/os/src/server/lx_fs/directory.h +++ b/repos/os/src/server/lx_fs/directory.h @@ -42,8 +42,16 @@ class File_system::Directory : public Node if (create) { mode_t ugo = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; ret = mkdir(path, ugo); - if (ret == -1) - throw No_space(); + if (ret == -1) { + switch (errno) { + case ENAMETOOLONG: throw Name_too_long(); + case EACCES: throw Permission_denied(); + case ENOENT: throw Lookup_failed(); + case EEXIST: throw Node_already_exists(); + case ENOSPC: + default: throw No_space(); + } + } } struct stat s;