From 4d69d88f20a7aa87d81004db44c1094ad1afea80 Mon Sep 17 00:00:00 2001 From: Dominic Cleal Date: Thu, 4 Sep 2014 08:44:20 +0100 Subject: [PATCH] * src/augeas.c (unlink_removed_files): ensure aug_save returns non-zero result when unable to delete files Fixes RHBZ#1091143 (cherry picked from commit b61a78d2e629e4f1395270a1ee72876e27b12990) Conflicts: NEWS --- src/augeas.c | 3 ++- tests/test-save.c | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/augeas.c b/src/augeas.c index 3c12443..014e145 100644 --- a/src/augeas.c +++ b/src/augeas.c @@ -1488,7 +1488,8 @@ static int unlink_removed_files(struct augeas *aug, for (struct tree *t = pathx_first(px); t != NULL; t = pathx_next(px)) { - remove_file(aug, t); + if (remove_file(aug, t) < 0) + result = -1; } free_pathx(px); } else if (tf->dirty && ! tree_child(tm, "path")) { diff --git a/tests/test-save.c b/tests/test-save.c index f28f626..1dac75d 100644 --- a/tests/test-save.c +++ b/tests/test-save.c @@ -29,6 +29,7 @@ #include #include #include +#include const char *abs_top_srcdir; const char *abs_top_builddir; @@ -70,6 +71,30 @@ static void teardown(ATTRIBUTE_UNUSED CuTest *tc) { root = NULL; } +static void testRemoveNoPermission(CuTest *tc) { + if (getuid() == 0) { + puts("pending (testRemoveNoPermission): can't test permissions under root account"); + return; + } + + int r; + const char *errmsg; + + // Prevent deletion of files + run(tc, "chmod 0500 %s/etc", root); + + r = aug_rm(aug, "/files/etc/hosts"); + CuAssertTrue(tc, r > 0); + + r = aug_save(aug); + CuAssertIntEquals(tc, -1, r); + + r = aug_get(aug, "/augeas/files/etc/hosts/error", &errmsg); + CuAssertIntEquals(tc, 1, r); + CuAssertPtrNotNull(tc, errmsg); + CuAssertStrEquals(tc, "unlink_orig", errmsg); +} + static void testSaveNewFile(CuTest *tc) { int r; @@ -285,6 +310,7 @@ int main(void) { CuSuiteSetup(suite, setup, teardown); SUITE_ADD_TEST(suite, testSaveNewFile); + SUITE_ADD_TEST(suite, testRemoveNoPermission); SUITE_ADD_TEST(suite, testNonExistentLens); SUITE_ADD_TEST(suite, testMultipleXfm); SUITE_ADD_TEST(suite, testMtime);