This re-shuffles struct entity a bit and removes the unneeded has_data indicator. Both data and datasz are not null when data is present and null when there is no data. With this in mind the code becomes simpler.
-- :wq Claudio Index: extern.h =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v retrieving revision 1.99 diff -u -p -r1.99 extern.h --- extern.h 22 Dec 2021 09:35:14 -0000 1.99 +++ extern.h 28 Dec 2021 15:40:55 -0000 @@ -336,13 +336,12 @@ enum publish_type { * and parsed. */ struct entity { - enum rtype type; /* type of entity (not RTYPE_EOF) */ + TAILQ_ENTRY(entity) entries; char *file; /* local path to file */ - int has_data; /* whether data blob is specified */ unsigned char *data; /* optional data blob */ size_t datasz; /* length of optional data blob */ int talid; /* tal identifier */ - TAILQ_ENTRY(entity) entries; + enum rtype type; /* type of entity (not RTYPE_EOF) */ }; TAILQ_HEAD(entityq, entity); Index: main.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v retrieving revision 1.169 diff -u -p -r1.169 main.c --- main.c 22 Dec 2021 09:35:14 -0000 1.169 +++ main.c 28 Dec 2021 15:39:11 -0000 @@ -120,9 +120,7 @@ entity_read_req(struct ibuf *b, struct e io_read_buf(b, &ent->type, sizeof(ent->type)); io_read_buf(b, &ent->talid, sizeof(ent->talid)); io_read_str(b, &ent->file); - io_read_buf(b, &ent->has_data, sizeof(ent->has_data)); - if (ent->has_data) - io_read_buf_alloc(b, (void **)&ent->data, &ent->datasz); + io_read_buf_alloc(b, (void **)&ent->data, &ent->datasz); } /* @@ -144,9 +142,7 @@ entity_write_req(const struct entity *en io_simple_buffer(b, &ent->type, sizeof(ent->type)); io_simple_buffer(b, &ent->talid, sizeof(ent->talid)); io_str_buffer(b, ent->file); - io_simple_buffer(b, &ent->has_data, sizeof(int)); - if (ent->has_data) - io_buf_buffer(b, ent->data, ent->datasz); + io_buf_buffer(b, ent->data, ent->datasz); io_close_buffer(&procq, b); } @@ -194,11 +190,8 @@ entityq_add(char *file, enum rtype type, p->type = type; p->talid = talid; p->file = file; - p->has_data = data != NULL; - if (p->has_data) { - p->data = data; - p->datasz = datasz; - } + p->data = data; + p->datasz = (data != NULL) ? datasz : 0; entity_queue++; Index: parser.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/parser.c,v retrieving revision 1.28 diff -u -p -r1.28 parser.c --- parser.c 4 Nov 2021 18:26:48 -0000 1.28 +++ parser.c 28 Dec 2021 15:40:04 -0000 @@ -195,7 +195,7 @@ proc_parser_cert(const struct entity *en STACK_OF(X509) *chain; STACK_OF(X509_CRL) *crls; - assert(!entp->has_data); + assert(entp->data == NULL); /* Extract certificate data and X509. */ @@ -274,7 +274,7 @@ proc_parser_root_cert(const struct entit struct cert *cert; X509 *x509; - assert(entp->has_data); + assert(entp->data != NULL); /* Extract certificate data and X509. */ @@ -525,7 +525,7 @@ parse_entity(struct entityq *q, struct m tal_free(tal); break; case RTYPE_CER: - if (entp->has_data) + if (entp->data != NULL) cert = proc_parser_root_cert(entp, f, flen); else cert = proc_parser_cert(entp, f, flen);