Not sure if it is that much of a win, but it saves some repetition and makes sure we don't forget checking the file name to be longer than 4 another time (missed on review in main() and proc_parser_file()).
Index: extern.h =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v retrieving revision 1.109 diff -u -p -r1.109 extern.h --- extern.h 19 Jan 2022 15:50:31 -0000 1.109 +++ extern.h 19 Jan 2022 16:51:05 -0000 @@ -286,7 +286,7 @@ void auth_insert(struct auth_tree *, s * There might be others we don't consider. */ enum rtype { - RTYPE_EOF = 0, + RTYPE_INVALID, RTYPE_TAL, RTYPE_MFT, RTYPE_ROA, @@ -451,6 +451,8 @@ int valid_filename(const char *); int valid_filehash(int, const char *, size_t); int valid_uri(const char *, size_t, const char *); int valid_origin(const char *, const char *); + +enum rtype rtype_from_file_extension(const char *); /* Working with CMS. */ unsigned char *cms_parse_validate(X509 **, const char *, Index: main.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v retrieving revision 1.178 diff -u -p -r1.178 main.c --- main.c 19 Jan 2022 15:50:31 -0000 1.178 +++ main.c 19 Jan 2022 16:51:05 -0000 @@ -356,6 +356,7 @@ static void queue_add_from_mft_set(const struct mft *mft, const char *name, struct repo *rp) { size_t i, sz; + enum rtype type; const struct mftfile *f; for (i = 0; i < mft->filesz; i++) { @@ -371,17 +372,18 @@ queue_add_from_mft_set(const struct mft f = &mft->files[i]; sz = strlen(f->file); assert(sz > 4); - if (strcasecmp(f->file + sz - 4, ".crl") == 0) + type = rtype_from_file_extension(f->file); + switch (type) { + case RTYPE_CER: + case RTYPE_ROA: + case RTYPE_GBR: + queue_add_from_mft(mft->path, f, type, rp); + break; + case RTYPE_CRL: continue; - else if (strcasecmp(f->file + sz - 4, ".cer") == 0) - queue_add_from_mft(mft->path, f, RTYPE_CER, rp); - else if (strcasecmp(f->file + sz - 4, ".roa") == 0) - queue_add_from_mft(mft->path, f, RTYPE_ROA, rp); - else if (strcasecmp(f->file + sz - 4, ".gbr") == 0) - queue_add_from_mft(mft->path, f, RTYPE_GBR, rp); - else - logx("%s: unsupported file type: %s", name, - f->file); + default: + logx("%s: unsupported file type: %s", name, f->file); + } } } @@ -839,15 +841,7 @@ main(int argc, char *argv[]) goto usage; } if (file != NULL) { - size_t sz; - - sz = strlen(file); - if (strcasecmp(file + sz - 4, ".tal") != 0 && - strcasecmp(file + sz - 4, ".cer") != 0 && - strcasecmp(file + sz - 4, ".crl") != 0 && - strcasecmp(file + sz - 4, ".mft") != 0 && - strcasecmp(file + sz - 4, ".roa") != 0 && - strcasecmp(file + sz - 4, ".gbr") != 0) + if (rtype_from_file_extension(file) == RTYPE_INVALID) errx(1, "unsupported or invalid file: %s", file); outputdir = NULL; Index: parser.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/parser.c,v retrieving revision 1.45 diff -u -p -r1.45 parser.c --- parser.c 19 Jan 2022 15:50:31 -0000 1.45 +++ parser.c 19 Jan 2022 16:51:05 -0000 @@ -949,23 +949,10 @@ proc_parser_file(char *file, unsigned ch struct tal *tal = NULL; enum rtype type; char *aia = NULL, *aki = NULL, *ski = NULL; - size_t sz; unsigned long verify_flags = X509_V_FLAG_CRL_CHECK; - sz = strlen(file); - if (strcasecmp(file + sz - 4, ".tal") == 0) - type = RTYPE_TAL; - else if (strcasecmp(file + sz - 4, ".cer") == 0) - type = RTYPE_CER; - else if (strcasecmp(file + sz - 4, ".crl") == 0) - type = RTYPE_CRL; - else if (strcasecmp(file + sz - 4, ".mft") == 0) - type = RTYPE_MFT; - else if (strcasecmp(file + sz - 4, ".roa") == 0) - type = RTYPE_ROA; - else if (strcasecmp(file + sz - 4, ".gbr") == 0) - type = RTYPE_GBR; - else + type = rtype_from_file_extension(file); + if (type == RTYPE_INVALID) errx(1, "%s: unsupported file type", file); switch (type) { Index: validate.c =================================================================== RCS file: /cvs/src/usr.sbin/rpki-client/validate.c,v retrieving revision 1.24 diff -u -p -r1.24 validate.c --- validate.c 13 Jan 2022 13:46:03 -0000 1.24 +++ validate.c 19 Jan 2022 16:51:05 -0000 @@ -234,6 +234,35 @@ valid_roa(const char *fn, struct auth_tr } /* + * Determine rtype corresponding to file extension. Returns RTYPE_INVALID + * on error or unkown extension. + */ +enum rtype +rtype_from_file_extension(const char *fn) +{ + size_t sz; + + sz = strlen(fn); + if (sz < 5) + return RTYPE_INVALID; + + if (strcasecmp(fn + sz - 4, ".tal") != 0) + return RTYPE_TAL; + if (strcasecmp(fn + sz - 4, ".cer") != 0) + return RTYPE_CER; + if (strcasecmp(fn + sz - 4, ".crl") != 0) + return RTYPE_CRL; + if (strcasecmp(fn + sz - 4, ".mft") != 0) + return RTYPE_MFT; + if (strcasecmp(fn + sz - 4, ".roa") != 0) + return RTYPE_ROA; + if (strcasecmp(fn + sz - 4, ".gbr") != 0) + return RTYPE_GBR; + + return RTYPE_INVALID; +} + +/* * Validate a filename listed on a Manifest. * draft-ietf-sidrops-6486bis section 4.2.2 * Returns 1 if filename is valid, otherwise 0. @@ -241,13 +270,8 @@ valid_roa(const char *fn, struct auth_tr int valid_filename(const char *fn) { - size_t sz; const unsigned char *c; - sz = strlen(fn); - if (sz < 5) - return 0; - for (c = fn; *c != '\0'; ++c) if (!isalnum(*c) && *c != '-' && *c != '_' && *c != '.') return 0; @@ -255,16 +279,15 @@ valid_filename(const char *fn) if (strchr(fn, '.') != strrchr(fn, '.')) return 0; - if (strcasecmp(fn + sz - 4, ".cer") == 0) - return 1; - if (strcasecmp(fn + sz - 4, ".crl") == 0) + switch (rtype_from_file_extension(fn)) { + case RTYPE_CER: + case RTYPE_CRL: + case RTYPE_GBR: + case RTYPE_ROA: return 1; - if (strcasecmp(fn + sz - 4, ".gbr") == 0) - return 1; - if (strcasecmp(fn + sz - 4, ".roa") == 0) - return 1; - - return 0; + default: + return 0; + } } /*