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.
This commit is contained in:
Colin Walters 2013-07-18 14:23:55 -04:00
parent 3e2d2f3e9e
commit 67823beb1f
4 changed files with 59 additions and 5 deletions

View File

@ -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))

@ -1 +1 @@
Subproject commit 939cd18d39b1abf39543c83c406246b12dbfa03a
Subproject commit f56702ef40a5df056097d2e14ee0dac3614b744c

View File

@ -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");

38
tests/test-setuid.sh Executable file
View File

@ -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