"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Martijn van Duren <openbsd+got@list.imperialat.at>
Subject:
Re: got fails to build on alpha
To:
Theo Buehler <tb@theobuehler.org>, "gameoftrees@openbsd.org" <gameoftrees@openbsd.org>, Stefan Sperling <stsp@stsp.name>
Date:
Sat, 10 Oct 2026 15:10:41 +0200

Download raw body.

Thread
These fix got-fetch-pack, and gotsh builds for me.
There's a couple of -Werror things I'll get back at separately.

Haven't looked too closely at the diff, but wouldn't it make sense to
use asprintf instead of calloc+snprintf, and strdup instead of calloc+
strlcpy?

martijn@

On 10/10/26 14:30, Stefan Sperling wrote:
> On Sat, Oct 10, 2026 at 02:15:29PM +0200, Stefan Sperling wrote:
>> On Fri, Oct 09, 2026 at 04:41:19PM +0200, Theo Buehler wrote:
>>> On Fri, Oct 09, 2026 at 04:39:03PM +0200, Stefan Sperling wrote:
>>>> This looks like something Miod might be qualified to take a look at?
>>>
>>> These files both have pretty huge structures on the stack. Might this be
>>> releated?
>>
>> In that case, the following diff might help:
> 
> I missed got-fetch-http, which also has a missing bounds check I am adding.
> 
>  
> M  libexec/got-fetch-http/got-fetch-http.c  |  20+  7-
> 
> 1 file changed, 20 insertions(+), 7 deletions(-)
> 
> commit - 22805600d8994acd612c568d0013c48a4476e16d
> commit + 0d94f4f452ee327a95f38015b32ae4fb82ad03b2
> blob - 8550578aa59341711d9c03188a0adc6f0d0fe04b
> blob + 7d4cb06c6a4d75d82c1431b1f4ce06158496e793
> --- libexec/got-fetch-http/got-fetch-http.c
> +++ libexec/got-fetch-http/got-fetch-http.c
> @@ -353,10 +353,10 @@ http_chunk(struct bufio *bio, const void *buf, size_t 
>  }
>  
>  static int
> -get_refs(int https, const char *host, const char *port, const char *path)
> +get_refs(int https, const char *host, const char *port, const char *path,
> +    char *buf, const size_t bufsize)
>  {
>  	struct bufio		 bio;
> -	char			 buf[GOT_PKT_MAX];
>  	const struct got_error	*e;
>  	size_t			 chunksz = 0;
>  	ssize_t			 r;
> @@ -400,7 +400,7 @@ get_refs(int https, const char *host, const char *port
>  	/* TODO: validate it's # service=git-upload-pack\n */
>  	while (skip > 0) {
>  		r = http_read(&bio, chunked, &chunksz, buf,
> -		    MINIMUM(skip, sizeof(buf)), NULL);
> +		    MINIMUM(skip, bufsize), NULL);
>  		if (r <= 0)
>  			goto err;
>  		skip -= r;
> @@ -417,10 +417,9 @@ err:
>  
>  static int
>  upload_request(int https, const char *host, const char *port, const char *path,
> -    FILE *in)
> +    FILE *in, char *buf, const size_t bufsize)
>  {
>  	struct bufio		 bio;
> -	char			 buf[GOT_PKT_MAX];
>  	const struct got_error	*e;
>  	ssize_t			 r;
>  	size_t			 chunksz = 0;
> @@ -477,6 +476,11 @@ upload_request(int https, const char *host, const char
>  			goto err;
>  		}
>  
> +		if (t > bufsize) {
> +			warnx("pktline len is too large");
> +			goto err;
> +		}
> +
>  		r = fread(buf + 4, 1, t - 4, in);
>  		if (r != t - 4)
>  			goto err;
> @@ -524,6 +528,8 @@ main(int argc, char **argv)
>  	char		*path;
>  	int		 https = 0;
>  	int		 ch;
> +	char		*buf = NULL;
> +	const size_t	 bufsize = GOT_PKT_MAX;
>  
>  #ifndef PROFILE
>  	if (pledge("stdio rpath inet dns unveil", NULL) == -1)
> @@ -570,7 +576,11 @@ main(int argc, char **argv)
>  	path = argv[3];
>  	got_path_strip_trailing_slashes(path);
>  
> -	if (get_refs(https, host, port, path) == -1)
> +	buf = calloc(1, bufsize);
> +	if (buf == NULL)
> +		err(1, "calloc");
> +
> +	if (get_refs(https, host, port, path, buf, bufsize) == -1)
>  		errx(1, "failed to get refs");
>  
>  	pfd.fd = 0;
> @@ -582,9 +592,12 @@ main(int argc, char **argv)
>  		return 0;
>  
>  	ungetc(ch, stdin);
> -	if (upload_request(https, host, port, path, stdin) == -1) {
> +	memset(buf, '\0', bufsize);
> +	if (upload_request(https, host, port, path, stdin,
> +	    buf, bufsize) == -1) {
>  		errx(1, "failed to upload request");
>  	}
>  
> +	free(buf);
>  	return 0;
>  }