On Sun, Jan 31, 2021 at 05:58:39AM +0700, Eugene Grosbein wrote: > 31.01.2021 5:26, Jilles Tjoelker wrote:
> >>> +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? > > Before the last newline, according to both comment and code. > Sorry, I don't get it. The "for" loop starts from the beginning, and > returns false (NOT binary, text file) after lowercase letter and first > newline, not last. The loop continues until the first NUL byte and will return false (not binary) when it encounters any newline after an ASCII lowercase letter, '$' or '`'. -- Jilles Tjoelker _______________________________________________ dev-commits-src-all@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all To unsubscribe, send any mail to "dev-commits-src-all-unsubscr...@freebsd.org"