On Sun, Feb 19, 2023 at 10:36:28AM +0000, Job Snijders wrote:
> Hi,
> 
> I wasn't entirely happy about how parse_load_crl_from_mft() behaved and
> refactored the function.
> 
> The good: if the MFT at hand was located in DIR_TEMP and no matching CRL
> could be found in DIR_TEMP, it would additionally attempt to find a CRL
> in DIR_VALID.
> The bad: if the MFT at hand was located in DIR_VALID, no attempt would
> be made to search for a matching CRL in DIR_TEMP; resulting in less
> opportunity to potentially salvage a broken situation at a future point
> in time with the help of locally cached artefacts.
> 
> If the following 5 commands are run (before and after applying the below
> changeset), one can observe that with this diff rpki-client's behaviour
> becomes more idempotent.
> 
>       rm -rf /var/cache/rpki-client/{*,.rrdp,.rsync}
> 
>       rpki-client -t /etc/rpki/lacnic.tal 2>&1 | fgrep 
> 6QvnUnEXe5JTf7VhQHnUFRwdzeEpbF4rt3b5PLrvdeyy
> 
>       ls -lahtr 
> /var/cache/rpki-client/{.rsync,.,.rrdp/*}/rpki-repo.registro.br/repo/6QvnUnEXe5JTf7VhQHnUFRwdzeEpbF4rt3b5PLrvdeyy/0/
> 
>       rpki-client -t /etc/rpki/lacnic.tal 2>&1 | fgrep 
> 6QvnUnEXe5JTf7VhQHnUFRwdzeEpbF4rt3b5PLrvdeyy
> 
>       ls -lahtr 
> /var/cache/rpki-client/{.rsync,.,.rrdp/*}/rpki-repo.registro.br/repo/6QvnUnEXe5JTf7VhQHnUFRwdzeEpbF4rt3b5PLrvdeyy/0/
> 
> With the diff applied, the second invocation of rpki-client won't delete
> CDD9973303E25E7554D25F5703FB347389D59326.crl & friends from DIR_TEMP;
> without this diff, we lose sight of some files. Losing the files hampers
> our ability to (re)construct the publication point if a future RRDP
> delta publish the correct ROAs (because by then we'd be missing the
> CRL).
> 
> Since SHA256 hashes are used to confirm the correct object is loaded, it
> doesn't matter whether the CRL comes from DIR_VALID, DIR_TEMP, USB
> stick, or pigeon carrier.
> 
> OK?

Fine with this change. As we discussed offlist this is the right approach
since the hash will protect us from loding a CRL that does not match with
the MFT.
 
One minor complaint below.

> Index: parser.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/parser.c,v
> retrieving revision 1.82
> diff -u -p -r1.82 parser.c
> --- parser.c  6 Jan 2023 16:06:43 -0000       1.82
> +++ parser.c  19 Feb 2023 10:17:09 -0000
> @@ -210,43 +210,47 @@ proc_parser_mft_check(const char *fn, st
>  }
>  
>  /*
> - * Load the correct CRL using the info from the MFT.
> + * Load the correct CRL using the SHA256 info from the MFT.
> + * Returns NULL if no valid matching CRL was found in either the staging area
> + * or the validated cache area.
>   */
>  static struct crl *
> -parse_load_crl_from_mft(struct entity *entp, struct mft *mft, enum location 
> loc)
> +parse_load_crl_from_mft(struct entity *entp, struct mft *mft)
>  {
> -     struct crl      *crl = NULL;
> -     unsigned char   *f = NULL;
> -     char            *fn = NULL;
> -     size_t           flen;
> +     char                    *fn = NULL;
> +     unsigned char           *f = NULL;
> +     struct crl              *res = NULL;

Why did you rename *crl to *res? For me res is normally more like an
integer result. I would prefer if you keep that as crl.

Still OK claudio@

> +     const enum location      loc[2] = { DIR_TEMP, DIR_VALID };
> +     size_t                   flen;
> +     int                      i;
>  
> -     while (1) {
> -             fn = parse_filepath(entp->repoid, entp->path, mft->crl, loc);
> +     for (i = 0; i < 2; i++) {
> +             fn = parse_filepath(entp->repoid, entp->path, mft->crl, loc[i]);
>               if (fn == NULL)
> -                     goto next;
> +                     continue;
>  
>               f = load_file(fn, &flen);
>               if (f == NULL && errno != ENOENT)
>                       warn("parse file %s", fn);
> -             if (f == NULL)
> -                     goto next;
> -             if (!valid_hash(f, flen, mft->crlhash, sizeof(mft->crlhash)))
> -                     goto next;
> -             crl = crl_parse(fn, f, flen);
> +             if (f == NULL) {
> +                     free(fn);
> +                     continue;
> +             }
> +
> +             if (valid_hash(f, flen, mft->crlhash, sizeof(mft->crlhash))) {
> +                     res = crl_parse(fn, f, flen);
> +                     break;
> +             }
>  
> -next:
>               free(f);
>               free(fn);
>               f = NULL;
>               fn = NULL;
> -
> -             if (crl != NULL)
> -                     return crl;
> -             if (loc == DIR_TEMP)
> -                     loc = DIR_VALID;
> -             else
> -                     return NULL;
>       }
> +
> +     free(f);
> +     free(fn);
> +     return res;
>  }
>  
>  /*
> @@ -268,7 +272,7 @@ proc_parser_mft_pre(char *file, const un
>       *errstr = NULL;
>       if ((mft = mft_parse(&x509, file, der, len)) == NULL)
>               return NULL;
> -     *crl = parse_load_crl_from_mft(entp, mft, loc);
> +     *crl = parse_load_crl_from_mft(entp, mft);
>  
>       a = valid_ski_aki(file, &auths, mft->ski, mft->aki);
>       if (!valid_x509(file, ctx, x509, a, *crl, errstr)) {
> 

-- 
:wq Claudio

Reply via email to