Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Jan 2021 23:10:09 +0700
From:      Eugene Grosbein <eugen@grosbein.net>
To:        Jilles Tjoelker <jilles@FreeBSD.org>, src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   Re: git: 3708b615c354 - stable/12 - sh: Allow more scripts without #!
Message-ID:  <5cee1fe4-8aa8-0ad7-55ab-125bfbcb7c7f@grosbein.net>
In-Reply-To: <202101301511.10UFBjcd033018@gitrepo.freebsd.org>
References:  <202101301511.10UFBjcd033018@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
30.01.2021 22:11, Jilles Tjoelker wrote:

[skip]

> +static bool
> +isbinary(const char *data, size_t len)
> +{
> +	const char *nul, *p;
> +	bool hasletter;
> +
> +	nul = memchr(data, '\0', len);
> +	if (nul == NULL)
> +		return false;
> +	/*
> +	 * POSIX says we shall allow execution if the initial part intended
> +	 * to be parsed by the shell consists of characters and does not
> +	 * contain the NUL character. This allows concatenating a shell
> +	 * script (ending with exec or exit) and a binary payload.
> +	 *
> +	 * In order to reject common binary files such as PNG images, check
> +	 * that there is a lowercase letter or expansion before the last
> +	 * newline before the NUL character, in addition to the check for
> +	 * the newline character suggested by POSIX.
> +	 */
> +	hasletter = false;
> +	for (p = data; *p != '\0'; p++) {
> +		if ((*p >= 'a' && *p <= 'z') || *p == '$' || *p == '`')
> +			hasletter = true;
> +		if (hasletter && *p == '\n')
> +			return false;
> +	}
> +	return true;
> +}

Before last newline or before first newline?





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5cee1fe4-8aa8-0ad7-55ab-125bfbcb7c7f>