Ran into this the other day and could not help myself to adjust the code.
If the mft is stale just bump the stale counter and be done. If not stale
queue all files from the mft for the next round.
In mft_parse I switched to a switch statement which is more obvious in my
opinion.
--
:wq Claudio
Index: main.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v
retrieving revision 1.171
diff -u -p -r1.171 main.c
--- main.c 4 Jan 2022 18:41:32 -0000 1.171
+++ main.c 6 Jan 2022 11:41:26 -0000
@@ -518,9 +518,10 @@ entity_process(struct ibuf *b, struct st
break;
}
mft = mft_read(b);
- if (mft->stale)
+ if (!mft->stale)
+ queue_add_from_mft_set(mft);
+ else
st->mfts_stale++;
- queue_add_from_mft_set(mft);
mft_free(mft);
break;
case RTYPE_CRL:
Index: mft.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/mft.c,v
retrieving revision 1.42
diff -u -p -r1.42 mft.c
--- mft.c 28 Oct 2021 13:51:42 -0000 1.42
+++ mft.c 6 Jan 2022 11:46:24 -0000
@@ -418,8 +418,8 @@ struct mft *
mft_parse(X509 **x509, const char *fn, const unsigned char *der, size_t len)
{
struct parse p;
- int c, rc = 0;
- size_t i, cmsz;
+ int rc = 0;
+ size_t cmsz;
unsigned char *cms;
memset(&p, 0, sizeof(struct parse));
@@ -451,30 +451,16 @@ mft_parse(X509 **x509, const char *fn, c
goto out;
}
- /*
- * If we're stale, then remove all of the files that the MFT
- * references as well as marking it as stale.
- */
-
- if ((c = mft_parse_econtent(cms, cmsz, &p)) == 0) {
- /*
- * FIXME: it should suffice to just mark this as stale
- * and have the logic around mft_read() simply ignore
- * the contents of stale entries, just like it does for
- * invalid ROAs or certificates.
- */
-
+ switch (mft_parse_econtent(cms, cmsz, &p)) {
+ case 0:
+ /* Mark MFT as stale. */
p.res->stale = 1;
- if (p.res->files != NULL)
- for (i = 0; i < p.res->filesz; i++)
- free(p.res->files[i].file);
- free(p.res->files);
- p.res->filesz = 0;
- p.res->files = NULL;
- } else if (c == -1)
+ break;
+ case -1:
goto out;
-
+ }
rc = 1;
+
out:
if (rc == 0) {
mft_free(p.res);