[ostree] core: Don't strip setuid bits when creating files
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] core: Don't strip setuid bits when creating files
- Date: Thu, 18 Jul 2013 18:26:53 +0000 (UTC)
commit 67823beb1f2c7bfddfc78e62616b77d197c66e67
Author: Colin Walters <walters verbum org>
Date: Thu Jul 18 14:23:55 2013 -0400
core: Don't strip setuid bits when creating files
This ugly regression occurred because I overlooked the fact that our
chown() invocation would strip off setuid.
Makefile-tests.am | 1 +
src/libgsystem | 2 +-
src/libostree/ostree-core.c | 23 +++++++++++++++++++----
tests/test-setuid.sh | 38 ++++++++++++++++++++++++++++++++++++++
4 files changed, 59 insertions(+), 5 deletions(-)
---
diff --git a/Makefile-tests.am b/Makefile-tests.am
index 7485784..19764e6 100644
--- a/Makefile-tests.am
+++ b/Makefile-tests.am
@@ -31,6 +31,7 @@ testfiles = test-basic \
test-pull-corruption \
test-admin-deploy-1 \
test-admin-deploy-2 \
+ test-setuid \
$(NULL)
insttest_SCRIPTS = $(addprefix tests/,$(testfiles:=.sh))
diff --git a/src/libgsystem b/src/libgsystem
index 939cd18..f56702e 160000
--- a/src/libgsystem
+++ b/src/libgsystem
@@ -1 +1 @@
-Subproject commit 939cd18d39b1abf39543c83c406246b12dbfa03a
+Subproject commit f56702ef40a5df056097d2e14ee0dac3614b744c
diff --git a/src/libostree/ostree-core.c b/src/libostree/ostree-core.c
index 99bc84d..ef9595d 100644
--- a/src/libostree/ostree-core.c
+++ b/src/libostree/ostree-core.c
@@ -1220,9 +1220,21 @@ ostree_create_file_from_input (GFile *dest_file,
}
else if (S_ISREG (mode))
{
- if (!gs_file_create (dest_file, mode, &out,
- cancellable, error))
- goto out;
+ if (finfo != NULL)
+ {
+ uid = g_file_info_get_attribute_uint32 (finfo, "unix::uid");
+ gid = g_file_info_get_attribute_uint32 (finfo, "unix::gid");
+
+ if (!gs_file_create_with_uidgid (dest_file, mode, uid, gid, &out,
+ cancellable, error))
+ goto out;
+ }
+ else
+ {
+ if (!gs_file_create (dest_file, mode, &out,
+ cancellable, error))
+ goto out;
+ }
if (input)
{
@@ -1250,7 +1262,10 @@ ostree_create_file_from_input (GFile *dest_file,
goto out;
}
- if (finfo != NULL)
+ /* We only need to chown for directories and symlinks; we already
+ * did a chown for files above via fchown().
+ */
+ if (finfo != NULL && !S_ISREG (mode))
{
uid = g_file_info_get_attribute_uint32 (finfo, "unix::uid");
gid = g_file_info_get_attribute_uint32 (finfo, "unix::gid");
diff --git a/tests/test-setuid.sh b/tests/test-setuid.sh
new file mode 100755
index 0000000..02aa9f6
--- /dev/null
+++ b/tests/test-setuid.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+#
+# Copyright (C) 2013 Colin Walters <walters verbum org>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+set -e
+
+echo "1..1"
+
+. $(dirname $0)/libtest.sh
+
+setup_test_repository "bare"
+
+cd ${test_tmpdir}
+cat > test-statoverride.txt <<EOF
++2048 /abinary
+EOF
+$OSTREE checkout test2 test2-checkout
+touch test2-checkout/abinary
+chmod a+x test2-checkout/abinary
+(cd test2-checkout && $OSTREE commit -b test2 -s "with statoverride" --statoverride=../test-statoverride.txt)
+rm -rf test2-checkout
+$OSTREE checkout test2 test2-checkout
+test -u test2-checkout/abinary
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]