[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#783548: choose-mirror: lists releases that don't include this arch



Steven Chamberlain <steven@pyro.eu.org> (2015-04-27):
> When installing kfreebsd or hurd in Expert mode, choose-mirror offers to
> install "jessie - stable" and "stretch - testing" even though the
> architecture being installed isn't part of those releases.
> 
> I've attached a patch that adds support for the Architectures: header,
> to not mention a release if it doesn't include the current arch.
> 
> Thanks.
> 
> -- System Information:
> Debian Release: jessie/sid
>   APT prefers unstable
>   APT policy: (500, 'unstable'), (500, 'oldstable')
> Architecture: kfreebsd-amd64 (x86_64)
> 
> Kernel: kFreeBSD 9.0-2-amd64-xenhvm-ipsec
> Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
> Shell: /bin/sh linked to /bin/dash

> diff --git a/choose-mirror.c b/choose-mirror.c
> index 65885f6..b7d4019 100644
> --- a/choose-mirror.c
> +++ b/choose-mirror.c
> @@ -300,9 +300,9 @@ static int get_release(struct release_t *release, const char *name) {
>  	char *command;
>  	FILE *f = NULL;
>  	char *wget_options, *hostname, *directory;
> -	char line[80];
> +	char line[BUFFER_LENGTH];
>  	char *p;
> -	char buf[SUITE_LENGTH];
> +	char buf[BUFFER_LENGTH];
>  
>  	hostname = add_protocol("hostname");
>  	debconf_get(debconf, hostname);
> @@ -321,7 +321,7 @@ static int get_release(struct release_t *release, const char *name) {
>  	}
>  
>  	wget_options = get_wget_options();
> -	command = xasprintf("wget %s %s://%s%s/dists/%s/Release -O - | grep -E '^(Suite|Codename):'",
> +	command = xasprintf("wget %s %s://%s%s/dists/%s/Release -O - | grep -E '^(Suite|Codename|Architectures):'",
>  			    wget_options, protocol, hostname, directory, name);
>  	di_log(DI_LOG_LEVEL_DEBUG, "command: %s", command);
>  	f = popen(command, "r");
> @@ -337,12 +337,14 @@ static int get_release(struct release_t *release, const char *name) {
>  			if (line[strlen(line) - 1] == '\n')
>  				line[strlen(line) - 1] = '\0';
>  			if ((value = strstr(line, ": ")) != NULL) {
> -				strncpy(buf, value + 2, SUITE_LENGTH - 1);
> -				buf[SUITE_LENGTH - 1] = '\0';
> +				strncpy(buf, value + 2, BUFFER_LENGTH - 1);
> +				buf[BUFFER_LENGTH - 1] = '\0';
>  				if (strncmp(line, "Codename:", 9) == 0)
>  					release->name = strdup(buf);
>  				if (strncmp(line, "Suite:", 6) == 0)
>  					release->suite = strdup(buf);
> +				if (strncmp(line, "Architectures:", 14) == 0)
> +					release->archs = strdup(buf);

I think you're missing some free() matching this strdup().

>  			}
>  		}
>  		if (release->name != NULL && strcmp(release->name, name) == 0)
> @@ -354,6 +356,14 @@ static int get_release(struct release_t *release, const char *name) {
>  		    !(release->status & IS_VALID))
>  			log_invalid_release(name, "Suite or Codename");
>  
> +		/* Does the release include this arch? */
> +		if (release->archs != NULL && strstr(release->archs, ARCH_TEXT) == NULL) {
> +			/* No:  disregard this release */
> +			log_invalid_release(name, "Architectures");
> +			release->status &= ~IS_VALID;
> +			release->name = NULL;
> +		}
> +
>  		/* Cross-validate the Release file */
>  		if (release->status & IS_VALID)
>  			if (! cross_validate_release(release))
> diff --git a/mirrors.h b/mirrors.h
> index e592b7a..f73aefb 100644
> --- a/mirrors.h
> +++ b/mirrors.h
> @@ -17,6 +17,12 @@ struct mirror_t {
>   */
>  #define MANUAL_ENTRY "manual"
>  
> +/*
> + * Allow to read the full Architectures: line from a Release file,
> + * which is up to 123 bytes long at time of writing.
> + */
> +#define BUFFER_LENGTH 256
> +
>  #define SUITE_LENGTH 32

(Slightly sad to see static buffers still being used but that's not your
fault. :))

Mraw,
KiBi.

Attachment: signature.asc
Description: Digital signature


Reply to: