* [PATCH] http-push: trim trailing newline from remote symref
@ 2015-01-13 2:28 Jeff King
2015-01-13 16:26 ` Kyle J. McKay
2015-01-13 20:41 ` Jeff King
0 siblings, 2 replies; 6+ messages in thread
From: Jeff King @ 2015-01-13 2:28 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano
When we fetch a symbolic ref file from the remote, we get
the whole string "ref: refs/heads/master\n", recognize it by
skipping past the "ref: ", and store the rest. We should
chomp the trailing newline.
This bug was introduced in ae021d8 (use skip_prefix to avoid
magic numbers, 2014-06-18), which did not notice that the
length computation fed to xmemdupz was quietly tweaked by 1
to account for this.
We can solve it by explicitly trimming the newline, which is
more obvious. Note that we use strbuf_rtrim here, which will
actually cut off any trailing whitespace, not just a single
newline. This is a good thing, though, as it makes our
parsing more liberal (and spaces are not valid in refnames
anyway).
Signed-off-by: Jeff King <peff@peff.net>
---
This is a regression in v2.1.0.
It was causing t5540 to fail, but I realized I have been building with
NO_EXPAT for a while, so I didn't notice. Frankly, I'm kind of surprised
and disturbed that nobody noticed it before now. More evidence that we
can kill off dumb http-push? I would have thought somebody else would
have noticed the test failure, though.
I am embarrassed to have introduced the bug during a refactoring patch.
But in my defense, the original code was quite subtle and horrible, and
I think the end result at least is much obvious (and is a good point in
favor of skip_prefix's existence!). The original came from eecc836
(Another memory overrun in http-push.c, 2007-03-01). Looking at that
patch, I can't understand how the code before it ever worked in the
first place.
http-push.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/http-push.c b/http-push.c
index 26dfa67..184d24a 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1578,6 +1578,9 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1)
if (buffer.len == 0)
return;
+ /* Cut off trailing newline. */
+ strbuf_rtrim(&buffer);
+
/* If it's a symref, set the refname; otherwise try for a sha1 */
if (skip_prefix(buffer.buf, "ref: ", &name)) {
*symref = xmemdupz(name, buffer.len - (name - buffer.buf));
--
2.2.1.425.g441bb3c
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] http-push: trim trailing newline from remote symref
2015-01-13 2:28 [PATCH] http-push: trim trailing newline from remote symref Jeff King
@ 2015-01-13 16:26 ` Kyle J. McKay
2015-01-13 19:58 ` Jeff King
2015-01-13 20:41 ` Jeff King
1 sibling, 1 reply; 6+ messages in thread
From: Kyle J. McKay @ 2015-01-13 16:26 UTC (permalink / raw)
To: Jeff King; +Cc: git, Junio C Hamano
On Jan 12, 2015, at 18:28, Jeff King wrote:
> When we fetch a symbolic ref file from the remote, we get
> the whole string "ref: refs/heads/master\n", recognize it by
> skipping past the "ref: ", and store the rest. We should
> chomp the trailing newline.
> [..]
> This is a regression in v2.1.0.
>
> It was causing t5540 to fail, but I realized I have been building with
> NO_EXPAT for a while, so I didn't notice. Frankly, I'm kind of
> surprised
> and disturbed that nobody noticed it before now. More evidence that we
> can kill off dumb http-push? I would have thought somebody else would
> have noticed the test failure, though.
I have this line in my 2.1.4 test output log:
t5540-http-push-webdav.sh .......................... ok
And again in my 2.2.2 test output log:
t5540-http-push-webdav.sh .......................... ok
Running the 2.2.2 version with -v I get:
t5540-http-push-webdav.sh ..
ok 1 - setup remote repository
ok 2 - create password-protected repository
ok 3 - setup askpass helper
ok 4 - clone remote repository
ok 5 - push to remote repository with packed refs
ok 6 - push already up-to-date
ok 7 - push to remote repository with unpacked refs
ok 8 - http-push fetches unpacked objects
ok 9 - http-push fetches packed objects
ok 10 - create and delete remote branch
ok 11 - MKCOL sends directory names with trailing slashes
ok 12 - PUT and MOVE sends object to URLs with SHA-1 hash suffix
ok 13 - non-fast-forward push fails
ok 14 - non-fast-forward push show ref status
ok 15 - non-fast-forward push shows help message
not ok 16 - force with lease aka cas # TODO known breakage
ok 17 - push to password-protected repository (user in URL)
not ok 18 - user was prompted only once for password # TODO known
breakage
not ok 19 - push to password-protected repository (no user in URL) #
TODO known breakage
# still have 3 known breakage(s)
# passed all remaining 16 test(s)
1..19
ok
I also get the same results using v2.3.0-rc0.
I do not build with NO_EXPAT. This is running the tests on OS X
without this patch applied. Is something else required to get a
failure?
-Kyle
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] http-push: trim trailing newline from remote symref
2015-01-13 16:26 ` Kyle J. McKay
@ 2015-01-13 19:58 ` Jeff King
2015-01-14 0:21 ` Kyle J. McKay
0 siblings, 1 reply; 6+ messages in thread
From: Jeff King @ 2015-01-13 19:58 UTC (permalink / raw)
To: Kyle J. McKay; +Cc: git, Junio C Hamano
On Tue, Jan 13, 2015 at 08:26:31AM -0800, Kyle J. McKay wrote:
> I have this line in my 2.1.4 test output log:
>
> t5540-http-push-webdav.sh .......................... ok
> [...]
> I do not build with NO_EXPAT. This is running the tests on OS X without
> this patch applied. Is something else required to get a failure?
Hmm. I think it is probably this:
http://curl.haxx.se/docs/adv_20150108B.html
where curl has started complaining about URLs with newlines in them. So
ae021d8 did introduce a bug, but older versions of curl did not really
care. The combination of ae021d8 with a new version of curl triggers the
problem.
And that also explains why it worked prior to eecc8367f4; curl was more
forgiving. Also, interestingly, if you "git log -S'- 6' http-push.c",
you can see the exact same bug reappear and go away in 2006/2007. The
implicit "chop one character" behavior is there in the original
3dfaf7bc, adding http-push support. Then it disappears as a side effect
of bfbd0bb6, and then comes back again in eecc8367.
Anyway. I think my patch is still the right thing. But that does explain
why we didn't notice the test failure.
-Peff
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] http-push: trim trailing newline from remote symref
2015-01-13 19:58 ` Jeff King
@ 2015-01-14 0:21 ` Kyle J. McKay
2015-01-16 1:19 ` Junio C Hamano
0 siblings, 1 reply; 6+ messages in thread
From: Kyle J. McKay @ 2015-01-14 0:21 UTC (permalink / raw)
To: Jeff King; +Cc: git, Junio C Hamano
On Jan 13, 2015, at 11:58, Jeff King wrote:
> On Tue, Jan 13, 2015 at 08:26:31AM -0800, Kyle J. McKay wrote:
>
>> I have this line in my 2.1.4 test output log:
>>
>> t5540-http-push-webdav.sh .......................... ok
>> [...]
>> I do not build with NO_EXPAT. This is running the tests on OS X
>> without
>> this patch applied. Is something else required to get a failure?
>
> Hmm. I think it is probably this:
>
> http://curl.haxx.se/docs/adv_20150108B.html
>
> where curl has started complaining about URLs with newlines in them.
> So
> ae021d8 did introduce a bug, but older versions of curl did not really
> care. The combination of ae021d8 with a new version of curl triggers
> the
> problem.
I'm running curl 7.38, and in this context "older" is anything before
7.40, so that would explain it. curl 7.38 was released 2014-09-10, so
it's only 4 months old at this point. 7.40 was only released 5 days
ago on 2015-01-08 which is probably why there have not been a whole
lot of reports about this so far.
> And that also explains why it worked prior to eecc8367f4; curl was
> more
> forgiving. Also, interestingly, if you "git log -S'- 6' http-push.c",
> you can see the exact same bug reappear and go away in 2006/2007. The
> implicit "chop one character" behavior is there in the original
> 3dfaf7bc, adding http-push support. Then it disappears as a side
> effect
> of bfbd0bb6, and then comes back again in eecc8367.
After updating to curl 7.40 I get:
t5540-http-push-webdav.sh (Wstat: 256 Tests: 19 Failed: 1)
Failed test: 10
Non-zero exit status: 1
> Anyway. I think my patch is still the right thing. But that does
> explain
> why we didn't notice the test failure.
And then after applying your patch I'm back to:
t5540-http-push-webdav.sh .. ok
So definitely a needed patch.
Tested-by: Kyle J. McKay <mackyle@gmail.com>
-Kyle
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] http-push: trim trailing newline from remote symref
2015-01-14 0:21 ` Kyle J. McKay
@ 2015-01-16 1:19 ` Junio C Hamano
0 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2015-01-16 1:19 UTC (permalink / raw)
To: Kyle J. McKay; +Cc: Jeff King, git
"Kyle J. McKay" <mackyle@gmail.com> writes:
> On Jan 13, 2015, at 11:58, Jeff King wrote:
> ...
> I'm running curl 7.38, and in this context "older" is anything before
> 7.40, so that would explain it. curl 7.38 was released 2014-09-10, so
> it's only 4 months old at this point. 7.40 was only released 5 days
> ago on 2015-01-08 which is probably why there have not been a whole
> lot of reports about this so far.
>
> After updating to curl 7.40 I get:
>
> t5540-http-push-webdav.sh (Wstat: 256 Tests: 19 Failed: 1)
> Failed test: 10
> Non-zero exit status: 1
>
>> Anyway. I think my patch is still the right thing. But that does
>> explain
>> why we didn't notice the test failure.
>
> And then after applying your patch I'm back to:
>
> t5540-http-push-webdav.sh .. ok
I see a Ubuntu box I have nearby has this:
curl (7.35.0-1ubuntu2.3) trusty-security; urgency=medium
* SECURITY UPDATE: URL request injection
- debian/patches/CVE-2014-8150.patch: drop bad chars from URL in
lib/url.c, added test to tests/data/Makefile.am, tests/data/test1529,
tests/libtest/Makefile.inc, tests/libtest/lib1529.c.
- CVE-2014-8150
-- Marc Deslauriers <marc.deslauriers@ubuntu.com> Wed, 14 Jan 2015 08:49:32 -0500
That explains why I started seeing the same on a box with 7.35.x
which looks older than 7.40.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] http-push: trim trailing newline from remote symref
2015-01-13 2:28 [PATCH] http-push: trim trailing newline from remote symref Jeff King
2015-01-13 16:26 ` Kyle J. McKay
@ 2015-01-13 20:41 ` Jeff King
1 sibling, 0 replies; 6+ messages in thread
From: Jeff King @ 2015-01-13 20:41 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano
On Mon, Jan 12, 2015 at 09:28:58PM -0500, Jeff King wrote:
> When we fetch a symbolic ref file from the remote, we get
> the whole string "ref: refs/heads/master\n", recognize it by
> skipping past the "ref: ", and store the rest. We should
> chomp the trailing newline.
>
> This bug was introduced in ae021d8 (use skip_prefix to avoid
> magic numbers, 2014-06-18), which did not notice that the
> length computation fed to xmemdupz was quietly tweaked by 1
> to account for this.
>
> We can solve it by explicitly trimming the newline, which is
> more obvious. Note that we use strbuf_rtrim here, which will
> actually cut off any trailing whitespace, not just a single
> newline. This is a good thing, though, as it makes our
> parsing more liberal (and spaces are not valid in refnames
> anyway).
While looking into Kyle's earlier response, I found that there is a
semi-duplicate of this function for the http-walker side:
http_fetch_ref. It already uses strbuf_rtrim, so I feel doubly good
about moving to its use here.
Almost certainly this duplicated functionality could be factored out. I
have very little interest in spending time cleaning up the http-push
code, though.
-Peff
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-01-16 1:19 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-13 2:28 [PATCH] http-push: trim trailing newline from remote symref Jeff King
2015-01-13 16:26 ` Kyle J. McKay
2015-01-13 19:58 ` Jeff King
2015-01-14 0:21 ` Kyle J. McKay
2015-01-16 1:19 ` Junio C Hamano
2015-01-13 20:41 ` Jeff King
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).