# [PATCH] http-push.c: DAV must support olny http and https scheme

7 messages from 2009-04-10 to 2009-04-13. Participants: Kirill A. Korinskiy, Junio C Hamano, Mike Hommey, Matthieu Moy.
Thread: https://gitlist.dev/t/18825

## Kirill A. Korinskiy, 2009-04-10 13:44

Subject: [PATCH] http-push.c: DAV must support olny http and https scheme
Message-ID: <1239371060-3978-1-git-send-email-catap@catap.ru>
URL: https://gitlist.dev/e/1239371060-3978-1-git-send-email-catap%40catap.ru

```
If the response from remote web-server have scp or other not http-like
scheme http-push can't go to change url, because DAV must work only
over HTTP (http and https scheme).

Signed-off-by: Kirill A. Korinskiy <catap@catap.ru>
---
 http-push.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/http-push.c b/http-push.c
index feeb340..48c9a04 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1457,16 +1457,17 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed)
 			}
 		} else if (!strcmp(ctx->name, DAV_PROPFIND_NAME) && ctx->cdata) {
 			char *path = ctx->cdata;
-			if (*ctx->cdata == 'h') {
-				path = strstr(path, "//");
-				if (path) {
-					path = strchr(path+2, '/');
-				}
-			}
-			if (path) {
-				path += repo->path_len;
-				ls->dentry_name = xstrdup(path);
+			if (!strcmp(ctx->cdata, "http://")) {
+				path = strchr(path + sizeof("http://") - 1, '/');
+			} else if (!strcmp(ctx->cdata, "https://")) {
+				path = strchr(path + sizeof("https://") - 1, '/');
 			}
+
+			path += remote->path_len;
+
+			ls->dentry_name = xmalloc(strlen(path) -
+						  remote->path_len + 1);
+			strcpy(ls->dentry_name, path + remote->path_len);
 		} else if (!strcmp(ctx->name, DAV_PROPFIND_COLLECTION)) {
 			ls->dentry_flags |= IS_DIR;
 		}
-- 
1.6.2

```

## Junio C Hamano, 2009-04-12 08:48

Subject: Re: [PATCH] http-push.c: DAV must support olny http and https scheme
Message-ID: <7vd4bi9s1m.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vd4bi9s1m.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <1239371060-3978-1-git-send-email-catap@catap.ru>

```
"Kirill A. Korinskiy" <catap@catap.ru> writes:

> If the response from remote web-server have scp or other not http-like
> scheme http-push can't go to change url, because DAV must work only
> over HTTP (http and https scheme).
>
> Signed-off-by: Kirill A. Korinskiy <catap@catap.ru>
> ---
>  http-push.c |   19 ++++++++++---------
>  1 files changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/http-push.c b/http-push.c
> index feeb340..48c9a04 100644
> --- a/http-push.c
> +++ b/http-push.c
> @@ -1457,16 +1457,17 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed)
>  			}
>  		} else if (!strcmp(ctx->name, DAV_PROPFIND_NAME) && ctx->cdata) {
>  			char *path = ctx->cdata;
> -			if (*ctx->cdata == 'h') {
> -				path = strstr(path, "//");
> -				if (path) {
> -					path = strchr(path+2, '/');
> -				}
> -			}
> -			if (path) {
> -				path += repo->path_len;
> -				ls->dentry_name = xstrdup(path);
> +			if (!strcmp(ctx->cdata, "http://")) {
> +				path = strchr(path + sizeof("http://") - 1, '/');
> +			} else if (!strcmp(ctx->cdata, "https://")) {
> +				path = strchr(path + sizeof("https://") - 1, '/');
>  			}
> +
> +			path += remote->path_len;

http-push.c: In function 'handle_remote_ls_ctx':
http-push.c:1466: error: 'remote' undeclared (first use in this function)
http-push.c:1466: error: (Each undeclared identifier is reported only once
http-push.c:1466: error: for each function it appears in.)

Ah, crap.

> +			ls->dentry_name = xmalloc(strlen(path) -
> +						  remote->path_len + 1);
> +			strcpy(ls->dentry_name, path + remote->path_len);
>  		} else if (!strcmp(ctx->name, DAV_PROPFIND_COLLECTION)) {
>  			ls->dentry_flags |= IS_DIR;
>  		}
> -- 
> 1.6.2

```

## Mike Hommey, 2009-04-12 09:00

Subject: Re: [PATCH] http-push.c: DAV must support olny http and https scheme
Message-ID: <20090412090053.GA9920@glandium.org>
URL: https://gitlist.dev/e/20090412090053.GA9920%40glandium.org
In-Reply-To: <7vd4bi9s1m.fsf@gitster.siamese.dyndns.org>

```
On Sun, Apr 12, 2009 at 01:48:05AM -0700, Junio C Hamano wrote:
> "Kirill A. Korinskiy" <catap@catap.ru> writes:
> 
> > If the response from remote web-server have scp or other not http-like
> > scheme http-push can't go to change url, because DAV must work only
> > over HTTP (http and https scheme).
> >
> > Signed-off-by: Kirill A. Korinskiy <catap@catap.ru>
> > ---
> >  http-push.c |   19 ++++++++++---------
> >  1 files changed, 10 insertions(+), 9 deletions(-)
> >
> > diff --git a/http-push.c b/http-push.c
> > index feeb340..48c9a04 100644
> > --- a/http-push.c
> > +++ b/http-push.c
> > @@ -1457,16 +1457,17 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed)
> >  			}
> >  		} else if (!strcmp(ctx->name, DAV_PROPFIND_NAME) && ctx->cdata) {
> >  			char *path = ctx->cdata;
> > -			if (*ctx->cdata == 'h') {
> > -				path = strstr(path, "//");
> > -				if (path) {
> > -					path = strchr(path+2, '/');
> > -				}
> > -			}
> > -			if (path) {
> > -				path += repo->path_len;
> > -				ls->dentry_name = xstrdup(path);
> > +			if (!strcmp(ctx->cdata, "http://")) {
> > +				path = strchr(path + sizeof("http://") - 1, '/');
> > +			} else if (!strcmp(ctx->cdata, "https://")) {
> > +				path = strchr(path + sizeof("https://") - 1, '/');
> >  			}
> > +
> > +			path += remote->path_len;
> 
> http-push.c: In function 'handle_remote_ls_ctx':
> http-push.c:1466: error: 'remote' undeclared (first use in this function)
> http-push.c:1466: error: (Each undeclared identifier is reported only once
> http-push.c:1466: error: for each function it appears in.)
> 
> Ah, crap.

s/remote/repo/. He must have done his patch before 7b5201a and rebased
afterwards without checking.

Mike

```

## Junio C Hamano, 2009-04-12 18:45

Subject: Re: [PATCH] http-push.c: DAV must support olny http and https scheme
Message-ID: <7vprfh7lua.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vprfh7lua.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <20090412090053.GA9920@glandium.org>

```
Mike Hommey <mh@glandium.org> writes:

>> http-push.c: In function 'handle_remote_ls_ctx':
>> http-push.c:1466: error: 'remote' undeclared (first use in this function)
>> http-push.c:1466: error: (Each undeclared identifier is reported only once
>> http-push.c:1466: error: for each function it appears in.)
>> 
>> Ah, crap.
>
> s/remote/repo/. He must have done his patch before 7b5201a and rebased
> afterwards without checking.

Oh, I know that.

The "crap" was about "sent without checking" part.

```

## Kirill A. Korinskiy, 2009-04-12 18:49

Subject: [PATCH] http-push.c: DAV must support olny http and https scheme
Message-ID: <1239562146-32133-1-git-send-email-catap@catap.ru>
URL: https://gitlist.dev/e/1239562146-32133-1-git-send-email-catap%40catap.ru
In-Reply-To: <7vd4bi9s1m.fsf@gitster.siamese.dyndns.org>

```
If the response from remote web-server have scp or other not http-like
scheme http-push can't go to change url, because DAV must work only
over HTTP (http and https scheme).

Signed-off-by: Kirill A. Korinskiy <catap@catap.ru>
---
 http-push.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/http-push.c b/http-push.c
index feeb340..cce9ead 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1457,16 +1457,17 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed)
 			}
 		} else if (!strcmp(ctx->name, DAV_PROPFIND_NAME) && ctx->cdata) {
 			char *path = ctx->cdata;
-			if (*ctx->cdata == 'h') {
-				path = strstr(path, "//");
-				if (path) {
-					path = strchr(path+2, '/');
-				}
-			}
-			if (path) {
-				path += repo->path_len;
-				ls->dentry_name = xstrdup(path);
+			if (!strcmp(ctx->cdata, "http://")) {
+				path = strchr(path + sizeof("http://") - 1, '/');
+			} else if (!strcmp(ctx->cdata, "https://")) {
+				path = strchr(path + sizeof("https://") - 1, '/');
 			}
+
+			path += repo->path_len;
+
+			ls->dentry_name = xmalloc(strlen(path) -
+						  repo->path_len + 1);
+			strcpy(ls->dentry_name, path + repo->path_len);
 		} else if (!strcmp(ctx->name, DAV_PROPFIND_COLLECTION)) {
 			ls->dentry_flags |= IS_DIR;
 		}
-- 
1.6.2

```

## Junio C Hamano, 2009-04-12 19:33

Subject: Re: [PATCH] http-push.c: DAV must support olny http and https scheme
Message-ID: <7vskkd651b.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vskkd651b.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <1239562146-32133-1-git-send-email-catap@catap.ru>

```
"Kirill A. Korinskiy" <catap@catap.ru> writes:

> If the response from remote web-server have scp or other not http-like
> scheme http-push can't go to change url, because DAV must work only
> over HTTP (http and https scheme).
>
> Signed-off-by: Kirill A. Korinskiy <catap@catap.ru>
> ---

Thanks.  I was wondering about a few more things about the patch and the
original code.

>  http-push.c |   19 ++++++++++---------
>  1 files changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/http-push.c b/http-push.c
> index feeb340..cce9ead 100644
> --- a/http-push.c
> +++ b/http-push.c
> @@ -1457,16 +1457,17 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed)
>  			}
>  		} else if (!strcmp(ctx->name, DAV_PROPFIND_NAME) && ctx->cdata) {
>  			char *path = ctx->cdata;
> -			if (*ctx->cdata == 'h') {
> -				path = strstr(path, "//");
> -				if (path) {
> -					path = strchr(path+2, '/');
> -				}
> -			}
> -			if (path) {
> -				path += repo->path_len;
> -				ls->dentry_name = xstrdup(path);

The original protects against an unexpected ctx->cdata such as

	http://frotz

that does not have any slash after the method:// part (in which case it
does not even set ls_dentry_name.


> +			if (!strcmp(ctx->cdata, "http://")) {
> +				path = strchr(path + sizeof("http://") - 1, '/');
> +			} else if (!strcmp(ctx->cdata, "https://")) {
> +				path = strchr(path + sizeof("https://") - 1, '/');

I wonder what happens if the strchr() returns NULL for such a broken
ctx->cdata.  Will it make strlen(path) later to segfault?

Besides, obviously this patch was never tested; you meant prefixcmp, not
strcmp here, so path never becomes NULL here.  Oh, and instead of
comparing with ctx->cdata it would be easier to compare against path.

>  			}
> +
> +			path += repo->path_len;
> +
> +			ls->dentry_name = xmalloc(strlen(path) -
> +						  repo->path_len + 1);
> +			strcpy(ls->dentry_name, path + repo->path_len);
>  		} else if (!strcmp(ctx->name, DAV_PROPFIND_COLLECTION)) {
>  			ls->dentry_flags |= IS_DIR;
>  		}
> -- 
> 1.6.2

```

## Matthieu Moy, 2009-04-13 16:44

Subject: Re: [PATCH] http-push.c: DAV must support olny http and https scheme
Message-ID: <vpq8wm4tser.fsf@bauges.imag.fr>
URL: https://gitlist.dev/e/vpq8wm4tser.fsf%40bauges.imag.fr
In-Reply-To: <1239562146-32133-1-git-send-email-catap@catap.ru>

```
"Kirill A. Korinskiy" <catap@catap.ru> writes:

> Subject: [PATCH] http-push.c: DAV must support olny http and https scheme
                                                  ^^

s/olny/only/ if it's not too late.

-- 
Matthieu

```
