git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: problem with http clone/pull

From
Junio C Hamano <junkio@cox.net>
Date
Sep 13, 2006, 00:39 UTC
Message-ID
<7vvensd2hh.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<7v7j08eikw.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <junkio@cox.net> writes:
Show 7 quoted lines
> Perhaps this would fix it?
>
> I am at work now and I haven't looked at the logic aruond it
> too deeply (e.g. I do not know if this breaks the relative
> alternate or http specific cases, nor the same or similar
> breakages were there in these other cases in the original code
> to begin with)
Side note:
Show 19 quoted lines
> diff --git a/http-fetch.c b/http-fetch.c
> index fac1760..d870390 100644
> --- a/http-fetch.c
> +++ b/http-fetch.c
> @@ -559,7 +559,13 @@ static void process_alternates_response(
>  			char *target = NULL;
>  			char *path;
>  			if (data[i] == '/') {
> -				serverlen = strchr(base + 8, '/') - base;
> +				/* This counts
> +				 * http://git.host/pub/scm/linux.git
> +				 * 1234567----here^
> +				 * so strcpy(dst, base, serverlen) will
> +				 * copy up to "...git.host/"
> +				 */
> +				serverlen = strchr(base + 7, '/') - base;
>  				okay = 1;
>  			} else if (!memcmp(data + i, "../", 3)) {
>  				i += 3;

The change between 7 and 8 does not really matter, because the hostname cannot be empty, and 8 was masking the breakage of this code; it was (perhaps deliberately) being sloppy to allow us to also skip over "protocol://" part for https:// case. Call it subtle if you want ;-).

I think the right thing for this part to do would be something like this:

diff --git a/http-fetch.c b/http-fetch.c
index fac1760..c7545f2 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -559,8 +559,18 @@ static void process_alternates_response(
 			char *target = NULL;
 			char *path;
 			if (data[i] == '/') {
-				serverlen = strchr(base + 8, '/') - base;
-				okay = 1;
+				/* This counts
+				 * http://git.host/pub/scm/linux.git
+				 * -----------here^
+				 * so memcpy(dst, base, serverlen) will
+				 * copy up to "...git.host".
+				 */
+				const char *colon_ss = strstr(base,"://");
+				if (colon_ss) {
+					serverlen = (strchr(colon_ss + 3, '/')
+						     - base);
+					okay = 1;
+				}
 			} else if (!memcmp(data + i, "../", 3)) {
 				i += 3;
 				serverlen = strlen(base);
@@ -583,11 +593,13 @@ static void process_alternates_response(
 					okay = 1;
 				}
 			}
-			/* skip 'objects' at end */
+			/* skip "objects\n" at end */
 			if (okay) {
 				target = xmalloc(serverlen + posn - i - 6);
-				strlcpy(target, base, serverlen);
-				strlcpy(target + serverlen, data + i, posn - i - 6);
+				memcpy(target, base, serverlen);
+				memcpy(target + serverlen, data + i,
+				       posn - i - 7);
+				target[serverlen + posn - i - 7] = 0;
 				if (get_verbosely)
 					fprintf(stderr,
 						"Also look at %s\n", target);
Previous: Junio C HamanoNext: Paul Mackerras
Message 4 of 6 in “problem with http clone/pull”
  1. Paul MackerrasSep 12, 2006
  2. Junio C HamanoSep 12, 2006
  3. Junio C HamanoSep 13, 2006
  4. Junio C HamanoSep 13, 2006
  5. Paul MackerrasSep 13, 2006
  6. Junio C HamanoSep 13, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.