On Thu, Dec 03, 2020 at 02:33:03PM +0100, Claudio Jeker wrote:
> Use asprintf with %.*s to construct the path based on the mft file
> location and the filename of the referenced file.
>
> Since the * field in printf(3) is expecting an int type, typecast the
> ptrdiff_t to an int. Add an assert check to make sure there is no
> overflow. Also do the same overflow check in mft.c where the same idiom is
> used.
>
> Maybe some PATH_MAX checks should be placed in the mft parser.
Ping
--
:wq Claudio
Index: main.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v
retrieving revision 1.85
diff -u -p -r1.85 main.c
--- main.c 2 Dec 2020 15:31:15 -0000 1.85
+++ main.c 3 Dec 2020 12:25:24 -0000
@@ -451,23 +451,16 @@ static void
queue_add_from_mft(int fd, struct entityq *q, const char *mft,
const struct mftfile *file, enum rtype type, size_t *eid)
{
- size_t sz;
char *cp, *nfile;
/* Construct local path from filename. */
-
- sz = strlen(file->file) + strlen(mft);
- if ((nfile = calloc(sz + 1, 1)) == NULL)
- err(1, "calloc");
-
/* We know this is host/module/... */
- strlcpy(nfile, mft, sz + 1);
- cp = strrchr(nfile, '/');
+ cp = strrchr(mft, '/');
assert(cp != NULL);
- cp++;
- *cp = '\0';
- strlcat(nfile, file->file, sz + 1);
+ assert(cp - mft < INT_MAX);
+ if (asprintf(&nfile, "%.*s/%s", (int)(cp - mft), mft, file->file) == -1)
+ err(1, "asprintf");
/*
* Since we're from the same directory as the MFT file, we know
Index: mft.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/mft.c,v
retrieving revision 1.19
diff -u -p -r1.19 mft.c
--- mft.c 6 Nov 2020 04:22:18 -0000 1.19
+++ mft.c 3 Dec 2020 12:37:15 -0000
@@ -17,6 +17,7 @@
#include <assert.h>
#include <err.h>
+#include <limits.h>
#include <stdarg.h>
#include <stdint.h>
#include <fcntl.h>
@@ -457,6 +458,7 @@ mft_validfilehash(const char *fn, const
/* Check hash of file now, but first build path for it */
cp = strrchr(fn, '/');
assert(cp != NULL);
+ assert(cp - fn < INT_MAX);
if (asprintf(&path, "%.*s/%s", (int)(cp - fn), fn, m->file) == -1)
err(1, "asprintf");