threads / patch / 6297

patchAuto-quote config values in config.c:store_write_pair()

Subject: [PATCH] Auto-quote config values in config.c:store_write_pair()

## tl;dr

4 messages between Jan 9, 2007 and Jan 9, 2007. Diffs are folded; open one to read it.

replies: 3people: 3as markdown or json

Brian Gernhardt· Jan 9, 2007, 05:27 UTC · lore
Suggested by Jakub Narebski <jnareb@gmail.com> on the list.

When we send a value to store_write_pair(), make sure that the value that gets read out matches the one passed in. This means that for any value that contains leading or trailing whitespace or any comment character (# and ;), we need to surround it in quotes.

Signed-off-by: Brian Gernhardt <benji@silverinsanity.com>
---
 config.c               |   14 ++++++++++++++
 t/t1300-repo-config.sh |   17 +++++++++++++++++
 2 files changed, 31 insertions(+), 0 deletions(-)
Show changes to 2 files +31 −0

config.c, t/t1300-repo-config.sh

diff --git a/config.c b/config.c
index 5cbd130..e99681a 100644
--- a/config.c
+++ b/config.c
@@ -496,11 +496,23 @@ static void store_write_section(int fd, const char* key)
 static void store_write_pair(int fd, const char* key, const char* value)
 {
 	int i;
+	int quote = 0;
+
+	/* Check to see if the value needs to be quoted. */
+	if (value[0] == ' ')
+		quote = 1;
+	for (i = 0; value[i]; i++)
+		if (value[i] == ';' || value[i] == '#')
+			quote = 1;
+	if (value[i-1] == ' ')
+		quote = 1;
 
 	write(fd, "\t", 1);
 	write(fd, key+store.baselen+1,
 		strlen(key+store.baselen+1));
 	write(fd, " = ", 3);
+	if (quote)
+		write(fd, "\"", 1);
 	for (i = 0; value[i]; i++)
 		switch (value[i]) {
 		case '\n': write(fd, "\\n", 2); break;
@@ -508,6 +520,8 @@ static void store_write_pair(int fd, const char* key, const char* value)
 		case '"': case '\\': write(fd, "\\", 1);
 		default: write(fd, value+i, 1);
 	}
+	if (quote)
+		write(fd, "\"", 1);
 	write(fd, "\n", 1);
 }
 
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index a29caa0..60acdd3 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -401,5 +401,22 @@ test_expect_success numbers '
 	test z1048576 = "z$m"
 '
 
+rm .git/config
+
+git-repo-config quote.leading " test"
+git-repo-config quote.ending "test "
+git-repo-config quote.semicolon "test;test"
+git-repo-config quote.hash "test#test"
+
+cat > expect << EOF
+[quote]
+	leading = " test"
+	ending = "test "
+	semicolon = "test;test"
+	hash = "test#test"
+EOF
+
+test_expect_success 'quoting' 'cmp .git/config expect'
+
 test_done
 
-- 
1.4.4.4.g4083
Johannes Schindelin· Jan 9, 2007, 10:29 UTC · re: Brian Gernhardt · lore

Re: [PATCH] Auto-quote config values in config.c:store_write_pair()

Hi,
On Tue, 9 Jan 2007, Brian Gernhardt wrote:
Show 11 quoted lines
> +	if (quote)
> +		write(fd, "\"", 1);
>  	for (i = 0; value[i]; i++)
>  		switch (value[i]) {
>  		case '\n': write(fd, "\\n", 2); break;
> @@ -508,6 +520,8 @@ static void store_write_pair(int fd, const char* key, const char* value)
>  		case '"': case '\\': write(fd, "\\", 1);
>  		default: write(fd, value+i, 1);
>  	}
> +	if (quote)
> +		write(fd, "\"", 1);
AFAICS this misses the case where you have to quote a single '"'.

Ciao, Dscho

Johannes Schindelin· Jan 9, 2007, 11:44 UTC · lore

Re: [PATCH] Auto-quote config values in config.c:store_write_pair()

Hi,
[Cc'ing list]
On Tue, 9 Jan 2007, Junio C Hamano wrote:
Show 24 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> > On Tue, 9 Jan 2007, Brian Gernhardt wrote:
> >
> >> +	if (quote)
> >> +		write(fd, "\"", 1);
> >>  	for (i = 0; value[i]; i++)
> >>  		switch (value[i]) {
> >>  		case '\n': write(fd, "\\n", 2); break;
> >> @@ -508,6 +520,8 @@ static void store_write_pair(int fd, const char* key, const char* value)
> >>  		case '"': case '\\': write(fd, "\\", 1);
> >>  		default: write(fd, value+i, 1);
> >>  	}
> >> +	if (quote)
> >> +		write(fd, "\"", 1);
> >
> > AFAICS this misses the case where you have to quote a single '"'.
> 
> 	$ git-repo-config qu.ot 'ab"cd'
>         $ git-repo-config --get qu.ot
>         ab"cd
>         $ tail -n 2 .git/config
>         [qu]
>         	ot = ab\"cd

Oooopps! Even more embarassing: you can see it in the diff (it is line 508 of the original code). And most embarassing: AFAICT I wrote the code myself!!!

So I shut up.

Ciao, Dscho

← back to recent threads