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

4 messages from 2007-01-09 to 2007-01-09. Participants: Brian Gernhardt, Junio C Hamano, Johannes Schindelin.
Thread: https://gitlist.dev/t/6297

## Brian Gernhardt, 2007-01-09 05:27

Subject: [PATCH] Auto-quote config values in config.c:store_write_pair()
Message-ID: <20070109052741.GB27927@Hermes.local>
URL: https://gitlist.dev/e/20070109052741.GB27927%40Hermes.local

```
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(-)

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

```

## Junio C Hamano, 2007-01-09 05:59

Subject: Re: [PATCH] Auto-quote config values in config.c:store_write_pair()
Message-ID: <7v7ivwspu8.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7v7ivwspu8.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <20070109052741.GB27927@Hermes.local>

```
Thanks.

```

## Johannes Schindelin, 2007-01-09 10:29

Subject: Re: [PATCH] Auto-quote config values in config.c:store_write_pair()
Message-ID: <Pine.LNX.4.63.0701091128170.22628@wbgn013.biozentrum.uni-wuerzburg.de>
URL: https://gitlist.dev/e/Pine.LNX.4.63.0701091128170.22628%40wbgn013.biozentrum.uni-wuerzburg.de
In-Reply-To: <20070109052741.GB27927@Hermes.local>

```
Hi,

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 '"'.

Ciao,
Dscho

```

## Johannes Schindelin, 2007-01-09 11:44

Subject: Re: [PATCH] Auto-quote config values in config.c:store_write_pair()
Message-ID: <Pine.LNX.4.63.0701091242330.22628@wbgn013.biozentrum.uni-wuerzburg.de>
URL: https://gitlist.dev/e/Pine.LNX.4.63.0701091242330.22628%40wbgn013.biozentrum.uni-wuerzburg.de
In-Reply-To: <7vps9ompix.fsf@assigned-by-dhcp.cox.net>

```
Hi,

[Cc'ing list]

On Tue, 9 Jan 2007, Junio C Hamano wrote:

> 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

```
