From 67823beb1f2c7bfddfc78e62616b77d197c66e67 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 18 Jul 2013 14:23:55 -0400 Subject: [PATCH] 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(-) create mode 100755 tests/test-setuid.sh diff --git a/Makefile-tests.am b/Makefile-tests.am index 7485784c..19764e66 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 939cd18d..f56702ef 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 99bc84da..ef9595d4 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 00000000..02aa9f61 --- /dev/null +++ b/tests/test-setuid.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# +# Copyright (C) 2013 Colin Walters +# +# 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 <