On Sun, Nov 17, 2019 at 10:05:11PM +0100, Kristaps Dzonsons wrote:
> If tal_read_file() returns a NULL buffer, which can happen with an empty
> file or one containing only comments, the NULL value eventually
> propogates to tal_parse_buffer() where it crashes on strchr().
>
> This patch also adds/fixes documentation to the some functions,
> specifies a NUL terminator instead of zero, and removes an unused variable.
Looks good, OK claudio@
> Index: tal.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/tal.c,v
> retrieving revision 1.13
> diff -u -p -u -r1.13 tal.c
> --- tal.c 6 Nov 2019 08:29:03 -0000 1.13
> +++ tal.c 17 Nov 2019 21:02:07 -0000
> @@ -40,7 +40,6 @@ tal_parse_buffer(const char *fn, char *b
> char *nl, *line;
> unsigned char *b64 = NULL;
> size_t sz;
> - ssize_t linelen;
> int rc = 0, b64sz;
> struct tal *tal = NULL;
> enum rtype rp;
> @@ -134,10 +133,9 @@ out:
> }
>
> /*
> - * Parse a TAL from a file conformant to RFC 7730.
> - * Returns the encoded data or NULL on failure.
> - * Failure can be any number of things: failure to open file, allocate
> - * memory, bad syntax, etc.
> + * Parse a TAL from "buf" conformant to RFC 7730 originally from a file
> + * named "fn".
> + * Returns the encoded data or NULL on syntax failure.
> */
> struct tal *
> tal_parse(const char *fn, char *buf)
> @@ -160,11 +158,19 @@ tal_parse(const char *fn, char *buf)
> if ((p->descr = malloc(dlen + 1)) == NULL)
> err(EXIT_FAILURE, NULL);
> memcpy(p->descr, d, dlen);
> - p->descr[dlen] = 0;
> + p->descr[dlen] = '\0';
>
> return p;
> }
>
> +/*
> + * Read the file named "file" into a returned, NUL-terminated buffer.
> + * This replaces CRLF terminators with plain LF, if found, and also
> + * elides document-leading comment lines starting with "#".
> + * Files may not exceeds 4096 bytes.
> + * This function exits on failure, so it always returns a buffer with
> + * TAL data.
> + */
> char *
> tal_read_file(const char *file)
> {
> @@ -222,7 +228,8 @@ tal_read_file(const char *file)
> if (ferror(in))
> err(EXIT_FAILURE, "getline: %s", file);
> fclose(in);
> -
> + if (buf == NULL)
> + errx(EXIT_FAILURE, "%s: no data", file);
> return buf;
> }
>
--
:wq Claudio