From: Job Snijders Subject: Re: rpki-client: add rsync baseuri-based batching To: tech@openbsd.org Date: Tue, 7 Jul 2026 15:41:15 +0000 On Tue, Jul 07, 2026 at 12:09:12PM +0000, Job Snijders wrote: > Question: I'm not sure the newly added calls to rsync_base_uri() > could ever fail, because nca_history_load() will already have called > rsync_base_uri() via valid_uri() on those same C strings, so perhaps > instead of 'continue' I should use an errx()? Or something else? Here is a better version: no duplicate calls to rsync_base_uri() and more symmetry with rpkiNotify batching. Feedback? OK? Index: extern.h =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v diff -u -p -r1.287 extern.h --- extern.h 1 Jul 2026 11:09:12 -0000 1.287 +++ extern.h 7 Jul 2026 15:40:47 -0000 @@ -159,6 +159,7 @@ struct nca_hist { char *ski; char *location; char *mfturi; + char *baseuri; char *notify; time_t since; time_t last_attempt; Index: nca.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/nca.c,v diff -u -p -r1.7 nca.c --- nca.c 1 Jul 2026 11:09:12 -0000 1.7 +++ nca.c 7 Jul 2026 15:40:47 -0000 @@ -31,6 +31,8 @@ #include "extern.h" +extern int rrdpon; + /* * Add a given CA cert into the non-functional CA tree. * Return 1 if a synchronization attempt is to be made, 0 otherwise. @@ -123,7 +125,7 @@ certidcmp(const struct nonfunc_ca *a, co RB_GENERATE(nca_tree, nonfunc_ca, entry, certidcmp); -static LIST_HEAD(, fqdnlistentry) notifys = LIST_HEAD_INITIALIZER(notifys); +static LIST_HEAD(, fqdnlistentry) batchlist = LIST_HEAD_INITIALIZER(batchlist); static RB_HEAD(nca_hist_tree, nca_hist) ncas_hist = RB_INITIALIZER(&ncas_hist); @@ -220,6 +222,37 @@ nca_decide_retry(const struct nca_hist * return 0; } +static void +insert_in_batchlist(const char *uri) +{ + struct fqdnlistentry *fle; + + if ((fle = malloc(sizeof(*fle))) == NULL) + err(1, NULL); + + if ((fle->fqdn = strdup(uri)) == NULL) + err(1, NULL); + + LIST_INSERT_HEAD(&batchlist, fle, entry); +} + +static int +find_in_batchlist(const char *uri) +{ + struct fqdnlistentry *fle; + size_t uri_len; + + uri_len = strlen(uri); + LIST_FOREACH(fle, &batchlist, entry) { + if (strlen(fle->fqdn) == uri_len && + strncasecmp(uri, fle->fqdn, uri_len) == 0) { + return 1; + } + } + + return 0; +} + /* * Determine which non-functioncal CAs are eligible for retry. * If multiple NCAs point to the same RRDP repo and at least one NCA is eligible @@ -230,7 +263,6 @@ ncas_plan_retries(void) { struct nca_hist *nca_hist; struct fqdnlistentry *fle, *fle_tmp; - size_t notify_len; RB_FOREACH(nca_hist, nca_hist_tree, &ncas_hist) { if (nca_decide_retry(nca_hist) == 0) { @@ -238,35 +270,24 @@ ncas_plan_retries(void) continue; } - if (nca_hist->notify == NULL) - continue; - - if ((fle = malloc(sizeof(*fle))) == NULL) - err(1, NULL); - - if ((fle->fqdn = strdup(nca_hist->notify)) == NULL) - err(1, NULL); + insert_in_batchlist(nca_hist->baseuri); - LIST_INSERT_HEAD(¬ifys, fle, entry); + if (nca_hist->notify != NULL && rrdpon) + insert_in_batchlist(nca_hist->notify); } RB_FOREACH(nca_hist, nca_hist_tree, &ncas_hist) { - if (nca_hist->notify == NULL) - continue; + if (find_in_batchlist(nca_hist->baseuri)) + nca_hist->defer = 0; - notify_len = strlen(nca_hist->notify); + if (nca_hist->notify == NULL || !rrdpon || !nca_hist->defer) + continue; - LIST_FOREACH(fle, ¬ifys, entry) { - if (strlen(fle->fqdn) == notify_len && - strncasecmp(nca_hist->notify, fle->fqdn, - notify_len) == 0) { - nca_hist->defer = 0; - break; - } - } + if (find_in_batchlist(nca_hist->notify)) + nca_hist->defer = 0; } - LIST_FOREACH_SAFE(fle, ¬ifys, entry, fle_tmp) { + LIST_FOREACH_SAFE(fle, &batchlist, entry, fle_tmp) { LIST_REMOVE(fle, entry); free(fle->fqdn); free(fle); @@ -364,6 +385,8 @@ nca_history_load(void) goto err; if ((nca_hist->mfturi = strdup(mfturi)) == NULL) err(1, NULL); + if (!rsync_base_uri(mfturi, &nca_hist->baseuri)) + goto err; notify = l; if (notify == NULL)