[PATCH] Be more careful with objects directory permissions on clone

Subsystems: the rest

DORMANTno replies

9 messages, 3 authors, 2016-06-15 · open the first message on its own page

[PATCH] Be more careful with objects directory permissions on clone

From: Mark Hills <hidden>
Date: 2016-06-15 22:44:34

Honour the setgid and umask when re-creating the objects directory
at the destination.

cpio in copy-pass mode aims to copy file permissions which causes this
problem and cannot be disabled. Be explicit by copying the directory
structure first, honouring the permissions at the destination, then copy
the files with their existing read-only permissions.

Signed-off-by: Mark Hills <redacted>
---
  git-clone.sh |    5 ++++-
  1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/git-clone.sh b/git-clone.sh
index 8c7fc7f..53c7e06 100755
--- a/git-clone.sh
+++ b/git-clone.sh
@@ -334,7 +334,10 @@ yes)
  			fi
  		fi &&
  		cd "$repo" &&
-		find objects -depth -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
+		# Create dirs using umask and permissions and destination
+		find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir -p) &&
+		# Copy 0444 permissions on files
+		find objects -type f -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
  			exit 1
  	fi
  	git-ls-remote "$repo" >"$GIT_DIR/CLONE_HEAD" || exit 1
-- 
1.5.5.1.126.g48d0c

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Johannes Sixt <hidden>
Date: 2016-06-15 22:44:34

Mark Hills schrieb:
Honour the setgid and umask when re-creating the objects directory
at the destination.

cpio in copy-pass mode aims to copy file permissions which causes this
problem and cannot be disabled. Be explicit by copying the directory
structure first, honouring the permissions at the destination, then copy
the files with their existing read-only permissions.
...
         cd "$repo" &&
-        find objects -depth -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
+        # Create dirs using umask and permissions and destination
+        find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir -p) &&
+        # Copy 0444 permissions on files
+        find objects -type f -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
Wouldn't that be better:

	find objects ! -type d -print | cpio ...

?

-- Hannes

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Mark Hills <hidden>
Date: 2016-06-15 22:44:34

On Mon, 5 May 2008, Johannes Sixt wrote:
Mark Hills schrieb:
quoted
Honour the setgid and umask when re-creating the objects directory
at the destination.

cpio in copy-pass mode aims to copy file permissions which causes this
problem and cannot be disabled. Be explicit by copying the directory
structure first, honouring the permissions at the destination, then copy
the files with their existing read-only permissions.
...
quoted
         cd "$repo" &&
-        find objects -depth -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
+        # Create dirs using umask and permissions and destination
+        find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir -p) &&
+        # Copy 0444 permissions on files
+        find objects -type f -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
Wouldn't that be better:

	find objects ! -type d -print | cpio ...

?
This was my first suggestion, unfortunately it shows up broken behaviour 
in all but the latest version of cpio. It creates 0700 directory 
permissions which is even worse.

I didn't find the later versions of cpio to be widespread, so I wrote the 
patch to work in all cases.

See the thread 'git-clone file permissions and cpio'.

Mark

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Johannes Sixt <hidden>
Date: 2016-06-15 22:44:34

Mark Hills schrieb:
On Mon, 5 May 2008, Johannes Sixt wrote:
quoted
Mark Hills schrieb:
quoted
         cd "$repo" &&
-        find objects -depth -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
+        # Create dirs using umask and permissions and destination
+        find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir
-p) &&
+        # Copy 0444 permissions on files
+        find objects -type f -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
Wouldn't that be better:

    find objects ! -type d -print | cpio ...

?
This was my first suggestion, unfortunately it shows up broken behaviour
in all but the latest version of cpio. It creates 0700 directory
permissions which is even worse.
Sorry, I should have mentioned that I meant to keep the 'find | xargs
mkdir' and replace only the second 'find | cpio'.

-- Hannes

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Mark Hills <hidden>
Date: 2016-06-15 22:44:34

On Mon, 5 May 2008, Johannes Sixt wrote:
Mark Hills schrieb:
quoted
On Mon, 5 May 2008, Johannes Sixt wrote:
quoted
Mark Hills schrieb:
quoted
         cd "$repo" &&
-        find objects -depth -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
+        # Create dirs using umask and permissions and destination
+        find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir
-p) &&
+        # Copy 0444 permissions on files
+        find objects -type f -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
Wouldn't that be better:

    find objects ! -type d -print | cpio ...

?
This was my first suggestion, unfortunately it shows up broken behaviour
in all but the latest version of cpio. It creates 0700 directory
permissions which is even worse.
Sorry, I should have mentioned that I meant to keep the 'find | xargs
mkdir' and replace only the second 'find | cpio'.
Ah, I see.

I tend to think that an inclusive match has less scope for future bad 
behaviour than an exclusive match. Have I missed the possiblity that there 
may be content in the objects directory which is not a directory or file?

Mark

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Johannes Sixt <hidden>
Date: 2016-06-15 22:44:34

Mark Hills schrieb:
On Mon, 5 May 2008, Johannes Sixt wrote:
quoted
Mark Hills schrieb:
quoted
On Mon, 5 May 2008, Johannes Sixt wrote:
quoted
Mark Hills schrieb:
quoted
         cd "$repo" &&
-        find objects -depth -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
+        # Create dirs using umask and permissions and destination
+        find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir
-p) &&
+        # Copy 0444 permissions on files
+        find objects -type f -print | cpio $cpio_quiet_flag -pumd$l
"$GIT_DIR/" || \
Wouldn't that be better:

    find objects ! -type d -print | cpio ...

?
This was my first suggestion, unfortunately it shows up broken behaviour
in all but the latest version of cpio. It creates 0700 directory
permissions which is even worse.
Sorry, I should have mentioned that I meant to keep the 'find | xargs
mkdir' and replace only the second 'find | cpio'.
Ah, I see.

I tend to think that an inclusive match has less scope for future bad
behaviour than an exclusive match. Have I missed the possiblity that
there may be content in the objects directory which is not a directory
or file?
Theoretically, you could have symbolic links to loose objects or packs.

Generally, you shouldn't change the behavior of a program more than necessary.

-- Hannes

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Mark Hills <hidden>
Date: 2016-06-15 22:44:34

On Mon, 5 May 2008, Johannes Sixt wrote:
Mark Hills schrieb:
quoted
I tend to think that an inclusive match has less scope for future bad 
behaviour than an exclusive match. Have I missed the possiblity that 
there may be content in the objects directory which is not a directory 
or file?
Theoretically, you could have symbolic links to loose objects or packs.

Generally, you shouldn't change the behavior of a program more than 
necessary.
Okay, here's a revised patch (I made a note about the cpio bug in the 
commit message too).

Thanks,

Mark



Be more careful with objects directory permissions on clone

Honour the setgid and umask when re-creating the objects directory
at the destination.

cpio in copy-pass mode aims to copy file permissions which causes this
problem and cannot be disabled. Be explicit by copying the directory
structure first, honouring the permissions at the destination, then copy
the files with 0444 permissions. This also avoids bugs in some versions
of cpio.

Signed-off-by: Mark Hills <redacted>
---
  git-clone.sh |    5 ++++-
  1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/git-clone.sh b/git-clone.sh
index 8c7fc7f..9d88d1c 100755
--- a/git-clone.sh
+++ b/git-clone.sh
@@ -334,7 +334,10 @@ yes)
  			fi
  		fi &&
  		cd "$repo" &&
-		find objects -depth -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
+		# Create dirs using umask and permissions and destination
+		find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir -p) &&
+		# Copy existing 0444 permissions on content
+		find objects ! -type d -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
  			exit 1
  	fi
  	git-ls-remote "$repo" >"$GIT_DIR/CLONE_HEAD" || exit 1
-- 
1.5.5.1.126.geeac

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Jakub Narebski <hidden>
Date: 2016-06-15 22:44:34

Mark Hills wrote:
-               find objects -depth -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
+               # Create dirs using umask and permissions and destination
+               find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir -p) &&
+               # Copy existing 0444 permissions on content
+               find objects ! -type d -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
By the way, it is important that previous version had -depth, and
proposed one doesn't? Was it about creating directories before files?

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

Re: [PATCH] Be more careful with objects directory permissions on clone

From: Johannes Sixt <hidden>
Date: 2016-06-15 22:44:34

Jakub Narebski schrieb:
Mark Hills wrote:
quoted
-               find objects -depth -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
+               # Create dirs using umask and permissions and destination
+               find objects -type d -print | (cd "$GIT_DIR" && xargs mkdir -p) &&
+               # Copy existing 0444 permissions on content
+               find objects ! -type d -print | cpio $cpio_quiet_flag -pumd$l "$GIT_DIR/" || \
By the way, it is important that previous version had -depth, and
proposed one doesn't? Was it about creating directories before files?
-depth means that directory names are listed *after* their content.
Consequently, it was about setting modification times and permissions on
directories *after* all of their content is created at the destination.

The intent of the new version is to not copy permissions of directories;
and since the modification times don't matter, the absence of -depth is ok.

-- Hannes
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help