diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e9fc23..8b87a09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ All notable changes to this project will be documented in this file. are excluded from the AMS, as required by [RFC 8617 section 4.1.2](https://datatracker.ietf.org/doc/html/rfc8617#section-4.1.2). - libopenarc - ARC headers are returned with a space before the header value. - libopenarc - String arguments are marked as `const` where applicable. +- libopenarc - String arguments are normal strings (`char *`) unless the + argument expects a binary string. - libopenarc - `ARC-Seal` headers containing `h=` tags cause a validation failure, as required by [RFC 8617 section 4.1.3](https://datatracker.ietf.org/doc/html/rfc8617#section-4.1.3). - milter - `Authentication-Results` and `ARC-Authentication-Results` include diff --git a/libopenarc/arc-canon.c b/libopenarc/arc-canon.c index 0b1171a..8487314 100644 --- a/libopenarc/arc-canon.c +++ b/libopenarc/arc-canon.c @@ -798,7 +798,7 @@ arc_canon_selecthdrs(ARC_MESSAGE *msg, char *colon; struct arc_hdrfield *hdr; struct arc_hdrfield **lhdrs; - unsigned char **hdrs; + char **hdrs; assert(msg != NULL); assert(ptrs != NULL); @@ -855,7 +855,7 @@ arc_canon_selecthdrs(ARC_MESSAGE *msg, shcnt++; } } - hdrs = ARC_CALLOC(shcnt, sizeof(unsigned char *)); + hdrs = ARC_CALLOC(shcnt, sizeof(char *)); if (hdrs == NULL) { ARC_FREE(lhdrs); @@ -868,7 +868,7 @@ arc_canon_selecthdrs(ARC_MESSAGE *msg, for (bar = strtok_r(msg->arc_hdrlist, ":", &ctx); bar != NULL; bar = strtok_r(NULL, ":", &ctx)) { - hdrs[n] = (unsigned char *) bar; + hdrs[n] = bar; n++; } @@ -878,7 +878,7 @@ arc_canon_selecthdrs(ARC_MESSAGE *msg, { lhdrs[shcnt] = NULL; - len = MIN(ARC_MAXHEADER, strlen((char *) hdrs[c])); + len = MIN(ARC_MAXHEADER, strlen(hdrs[c])); while (len > 0 && ARC_ISWSP(hdrs[c][len - 1])) { len--; @@ -892,7 +892,7 @@ arc_canon_selecthdrs(ARC_MESSAGE *msg, } if (len == hdr->hdr_namelen && - strncasecmp((char *) hdr->hdr_text, (char *) hdrs[c], len) == 0) + strncasecmp(hdr->hdr_text, hdrs[c], len) == 0) { lhdrs[shcnt] = hdr; } @@ -1334,7 +1334,7 @@ arc_canon_runheaders(ARC_MESSAGE *msg) /* terminate the header field name and test */ hdr->hdr_text[hdr->hdr_namelen] = '\0'; - status = regexec(hdrtest, (char *) hdr->hdr_text, 0, NULL, 0); + status = regexec(hdrtest, hdr->hdr_text, 0, NULL, 0); /* restore the character */ hdr->hdr_text[hdr->hdr_namelen] = savechar; diff --git a/libopenarc/arc-dns.c b/libopenarc/arc-dns.c index bc21082..d72f5d8 100644 --- a/libopenarc/arc-dns.c +++ b/libopenarc/arc-dns.c @@ -163,12 +163,12 @@ arc_res_cancel(void *srv, void *qh) */ int -arc_res_query(void *srv, - int type, - const unsigned char *query, - unsigned char *buf, - size_t buflen, - void **qh) +arc_res_query(void *srv, + int type, + const char *query, + unsigned char *buf, + size_t buflen, + void **qh) { int n; int ret; @@ -180,11 +180,10 @@ arc_res_query(void *srv, #ifdef HAVE_RES_NINIT statp = srv; - n = res_nmkquery(statp, QUERY, (const char *) query, C_IN, type, NULL, 0, - NULL, qbuf, sizeof qbuf); + n = res_nmkquery(statp, QUERY, query, C_IN, type, NULL, 0, NULL, qbuf, + sizeof qbuf); #else /* HAVE_RES_NINIT */ - n = res_mkquery(QUERY, (const char *) query, C_IN, type, NULL, 0, NULL, - qbuf, sizeof qbuf); + n = res_mkquery(QUERY, query, C_IN, type, NULL, 0, NULL, qbuf, sizeof qbuf); #endif /* HAVE_RES_NINIT */ if (n == (size_t) -1) { diff --git a/libopenarc/arc-dns.h b/libopenarc/arc-dns.h index 5c45b2c..40aea9f 100644 --- a/libopenarc/arc-dns.h +++ b/libopenarc/arc-dns.h @@ -15,7 +15,7 @@ extern void arc_res_close(void *); extern int arc_res_init(void **); extern int arc_res_nslist(void *, const char *); extern int arc_res_query( - void *, int, const unsigned char *, unsigned char *, size_t, void **); + void *, int, const char *, unsigned char *, size_t, void **); extern int arc_res_waitreply( void *, void *, struct timeval *, size_t *, int *, int *); diff --git a/libopenarc/arc-keys.c b/libopenarc/arc-keys.c index b03b026..2e72675 100644 --- a/libopenarc/arc-keys.c +++ b/libopenarc/arc-keys.c @@ -137,8 +137,8 @@ arc_get_key_dns(ARC_MESSAGE *msg, char *buf, size_t buflen) return ARC_STAT_KEYFAIL; } - status = lib->arcl_dns_start(lib->arcl_dns_service, T_TXT, - (unsigned char *) qname, ansbuf, anslen, &q); + status = lib->arcl_dns_start(lib->arcl_dns_service, T_TXT, qname, ansbuf, + anslen, &q); if (status != 0) { diff --git a/libopenarc/arc-types.h b/libopenarc/arc-types.h index b95e4c1..2e71a94 100644 --- a/libopenarc/arc-types.h +++ b/libopenarc/arc-types.h @@ -193,12 +193,12 @@ struct arc_lib void *arcl_dns_service; int (*arcl_dns_init)(void **srv); void (*arcl_dns_close)(void *srv); - int (*arcl_dns_start)(void *srv, - int type, - const unsigned char *query, - unsigned char *buf, - size_t buflen, - void **qh); + int (*arcl_dns_start)(void *srv, + int type, + const char *query, + unsigned char *buf, + size_t buflen, + void **qh); int (*arcl_dns_cancel)(void *srv, void *qh); int (*arcl_dns_waitreply)(void *srv, void *qh, diff --git a/libopenarc/arc-util.c b/libopenarc/arc-util.c index 1bf0ae2..0efbe9d 100644 --- a/libopenarc/arc-util.c +++ b/libopenarc/arc-util.c @@ -54,17 +54,14 @@ */ bool -arc_hdrlist(unsigned char *buf, - size_t buflen, - unsigned char **hdrlist, - bool first) +arc_hdrlist(char *buf, size_t buflen, char **hdrlist, bool first) { - bool escape = false; - int c; - int len; - unsigned char *p; - unsigned char *q; - unsigned char *end; + bool escape = false; + int c; + int len; + char *p; + char *q; + char *end; assert(buf != NULL); assert(hdrlist != NULL); @@ -78,7 +75,7 @@ arc_hdrlist(unsigned char *buf, if (!first) { - len = strlcat((char *) buf, "|", buflen); + len = strlcat(buf, "|", buflen); if (len >= buflen) { return false; @@ -86,7 +83,7 @@ arc_hdrlist(unsigned char *buf, } else { - len = strlen((char *) buf); + len = strlen(buf); } first = false; diff --git a/libopenarc/arc-util.h b/libopenarc/arc-util.h index 45c381b..33e114c 100644 --- a/libopenarc/arc-util.h +++ b/libopenarc/arc-util.h @@ -20,7 +20,7 @@ extern int arc_check_dns_reply(unsigned char *ansbuf, int xclass, int xtype); -extern bool arc_hdrlist(unsigned char *, size_t, unsigned char **, bool); +extern bool arc_hdrlist(char *, size_t, char **, bool); extern void arc_min_timeval(struct timeval *, struct timeval *, diff --git a/libopenarc/arc.c b/libopenarc/arc.c index 955b2dc..6b2309a 100644 --- a/libopenarc/arc.c +++ b/libopenarc/arc.c @@ -661,7 +661,7 @@ arc_getamshdr_d( { bool first = true; - for (pv = strtok_r((char *) arc_dstring_get(tmpbuf), DELIMITER, &ctx); + for (pv = strtok_r(arc_dstring_get(tmpbuf), DELIMITER, &ctx); pv != NULL; pv = strtok_r(NULL, DELIMITER, &ctx)) { if (!first) @@ -1050,9 +1050,8 @@ arc_options(ARC_LIB *lib, int op, int arg, void *val, size_t valsz) } else { - int status; - unsigned char **hdrs; - char buf[BUFRSZ + 1]; + int status; + char buf[BUFRSZ + 1]; if (lib->arcl_signre) { @@ -1061,9 +1060,8 @@ arc_options(ARC_LIB *lib, int op, int arg, void *val, size_t valsz) } memset(buf, '\0', sizeof buf); - hdrs = (unsigned char **) val; (void) strlcpy(buf, "^(", sizeof buf); - if (!arc_hdrlist((unsigned char *) buf, sizeof buf, hdrs, true)) + if (!arc_hdrlist(buf, sizeof buf, (char **) val, true)) { return ARC_STAT_INVALID; } @@ -1097,7 +1095,7 @@ arc_options(ARC_LIB *lib, int op, int arg, void *val, size_t valsz) { if (lib->arcl_oversignhdrs != NULL) { - arc_clobber_array((char **) lib->arcl_oversignhdrs); + arc_clobber_array(lib->arcl_oversignhdrs); } lib->arcl_oversignhdrs = NULL; } @@ -1146,12 +1144,12 @@ arc_set_dns(ARC_LIB *lib, void (*dns_callback)(const void *context), int dns_callback_int, void (*dns_close)(void *srv), - int (*dns_start)(void *srv, - int type, - const unsigned char *query, - unsigned char *buf, - size_t buflen, - void **qh), + int (*dns_start)(void *srv, + int type, + const char *query, + unsigned char *buf, + size_t buflen, + void **qh), int (*dns_cancel)(void *srv, void *qh), int (*dns_waitreply)(void *srv, void *qh, @@ -1541,7 +1539,7 @@ arc_process_set(ARC_MESSAGE *msg, arc_error(msg, "unable to allocate %d byte(s)", len + 1); return ARC_STAT_INTERNAL; } - strlcpy((char *) hcopy, (char *) str, len + 1); + strlcpy(hcopy, str, len + 1); set = ARC_CALLOC(1, sizeof(ARC_KVSET)); if (set == NULL) @@ -2415,12 +2413,12 @@ arc_validate_seal(ARC_MESSAGE *msg, unsigned int setnum) */ ARC_MESSAGE * -arc_message(ARC_LIB *lib, - arc_canon_t canonhdr, - arc_canon_t canonbody, - arc_alg_t signalg, - arc_mode_t mode, - const unsigned char **err) +arc_message(ARC_LIB *lib, + arc_canon_t canonhdr, + arc_canon_t canonbody, + arc_alg_t signalg, + arc_mode_t mode, + const char **err) { ARC_MESSAGE *msg; @@ -2428,7 +2426,7 @@ arc_message(ARC_LIB *lib, { if (err != NULL) { - *err = (unsigned char *) "no mode(s) selected"; + *err = "no mode(s) selected"; } return NULL; } @@ -2438,7 +2436,7 @@ arc_message(ARC_LIB *lib, { if (err != NULL) { - *err = (unsigned char *) strerror(errno); + *err = strerror(errno); } return NULL; } @@ -2557,13 +2555,13 @@ arc_free(ARC_MESSAGE *msg) static ARC_STAT arc_parse_header_field(ARC_MESSAGE *msg, - const unsigned char *hdr, + const char *hdr, size_t hlen, struct arc_hdrfield **ret) { - const unsigned char *colon; - const unsigned char *semicolon; - const unsigned char *end = NULL; + const char *colon; + const char *semicolon; + const char *end = NULL; size_t c; struct arc_hdrfield *h; @@ -2578,11 +2576,10 @@ arc_parse_header_field(ARC_MESSAGE *msg, if (colon == NULL) { /* - ** Field names are printable ASCII; also tolerate - ** plain whitespace. + ** Field names are printable ASCII. */ - if (hdr[c] < 32 || hdr[c] > 126) + if (!isprint(hdr[c])) { return ARC_STAT_SYNTAX; } @@ -2595,12 +2592,10 @@ arc_parse_header_field(ARC_MESSAGE *msg, } else { - /* field bodies are printable ASCII, SP, HT, CR, LF, or UTF-8 */ - if (!(hdr[c] == 9 || /* HT */ - hdr[c] == 10 || /* LF */ - hdr[c] == 13 || /* CR */ - (hdr[c] >= 32 && hdr[c] <= 126) || /* SP, print */ - (hdr[c] > 127))) /* UTF-8 */ + /* field bodies are printable ASCII, HT (9), LF (10), CR (13), or + * UTF-8 */ + if (isascii(hdr[c]) && !(isprint(hdr[c]) || hdr[c] == 9 || + hdr[c] == 10 || hdr[c] == 13)) { return ARC_STAT_SYNTAX; } @@ -2641,7 +2636,7 @@ arc_parse_header_field(ARC_MESSAGE *msg, if ((msg->arc_library->arcl_flags & ARC_LIBFLAGS_FIXCRLF) != 0) { - unsigned char prev = '\0'; + char prev = '\0'; struct arc_dstring *tmphdr; tmphdr = arc_dstring_new(BUFRSZ, MAXBUFRSZ, msg, &arc_error_cb); @@ -2651,8 +2646,7 @@ arc_parse_header_field(ARC_MESSAGE *msg, return ARC_STAT_NORESOURCE; } - for (const unsigned char *p = hdr, *q = hdr + hlen; p < q && *p != '\0'; - p++) + for (const char *p = hdr, *q = hdr + hlen; p < q && *p != '\0'; p++) { if (*p == '\n' && prev != '\r') /* bare LF */ { @@ -2682,7 +2676,7 @@ arc_parse_header_field(ARC_MESSAGE *msg, } else { - h->hdr_text = strndup((const char *) hdr, hlen); + h->hdr_text = strndup(hdr, hlen); } if (h->hdr_text == NULL) @@ -2714,7 +2708,7 @@ arc_parse_header_field(ARC_MESSAGE *msg, */ ARC_STAT -arc_header_field(ARC_MESSAGE *msg, const unsigned char *hdr, size_t hlen) +arc_header_field(ARC_MESSAGE *msg, const char *hdr, size_t hlen) { ARC_STAT status; struct arc_hdrfield *h; @@ -3331,7 +3325,7 @@ arc_getseal(ARC_MESSAGE *msg, const char *domain, const unsigned char *key, size_t keylen, - const unsigned char *ar) + const char *ar) { int rstatus; size_t siglen; @@ -3499,11 +3493,10 @@ arc_getseal(ARC_MESSAGE *msg, } else { - arc_dstring_printf(dstr, "; %s", (const char *) ar); + arc_dstring_printf(dstr, "; %s", ar); } - status = arc_parse_header_field(msg, - (unsigned char *) arc_dstring_get(dstr), + status = arc_parse_header_field(msg, arc_dstring_get(dstr), arc_dstring_len(dstr), &h); if (status != ARC_STAT_OK) { @@ -3761,14 +3754,14 @@ arc_getseal(ARC_MESSAGE *msg, ** Header field name stored in the object. */ -unsigned char * +char * arc_hdr_name(ARC_HDRFIELD *hdr, size_t *len) { if (len != NULL) { *len = hdr->hdr_namelen; } - return (unsigned char *) hdr->hdr_text; + return hdr->hdr_text; } /* @@ -3781,10 +3774,10 @@ arc_hdr_name(ARC_HDRFIELD *hdr, size_t *len) ** Header field value stored in the object. */ -unsigned char * +char * arc_hdr_value(ARC_HDRFIELD *hdr) { - return (unsigned char *) hdr->hdr_text + hdr->hdr_namelen + 1; + return hdr->hdr_text + hdr->hdr_namelen + 1; } /* @@ -3904,7 +3897,7 @@ arc_chain_status_str(ARC_MESSAGE *msg) */ int -arc_chain_custody_str(ARC_MESSAGE *msg, unsigned char *buf, size_t buflen) +arc_chain_custody_str(ARC_MESSAGE *msg, char *buf, size_t buflen) { int set; ARC_KVSET *kvset; @@ -3935,12 +3928,10 @@ arc_chain_custody_str(ARC_MESSAGE *msg, unsigned char *buf, size_t buflen) kvset = msg->arc_sets[set].arcset_ams->hdr_data; str = arc_param_get(kvset, "d"); (void) arc_dstring_printf(tmpbuf, "%s%s", - (set < msg->arc_nsets - 1 ? ":" : ""), - (char *) str); + (set < msg->arc_nsets - 1 ? ":" : ""), str); } - appendlen = snprintf((char *) buf, buflen, "%s", - (char *) arc_dstring_get(tmpbuf)); + appendlen = snprintf(buf, buflen, "%s", arc_dstring_get(tmpbuf)); arc_dstring_free(tmpbuf); return appendlen; diff --git a/libopenarc/arc.h b/libopenarc/arc.h index 2ed29e0..f59abac 100644 --- a/libopenarc/arc.h +++ b/libopenarc/arc.h @@ -361,8 +361,7 @@ extern ARC_STAT arc_set_dns( void (*)(const void *), int, void (*)(void *), - int (*)( - void *, int, const unsigned char *, unsigned char *, size_t, void **), + int (*)(void *, int, const char *, unsigned char *, size_t, void **), int (*)(void *, void *), int (*)(void *, void *, struct timeval *, size_t *, int *, int *)); @@ -393,12 +392,8 @@ extern const char *arc_getsslbuf(ARC_LIB *); ** A new message instance, or NULL on failure (and "err" is updated). */ -extern ARC_MESSAGE *arc_message(ARC_LIB *, - arc_canon_t, - arc_canon_t, - arc_alg_t, - arc_mode_t, - const unsigned char **); +extern ARC_MESSAGE *arc_message( + ARC_LIB *, arc_canon_t, arc_canon_t, arc_alg_t, arc_mode_t, const char **); /* ** ARC_FREE -- deallocate a message object @@ -424,7 +419,7 @@ extern void arc_free(ARC_MESSAGE *); ** An ARC_STAT_* constant. */ -extern ARC_STAT arc_header_field(ARC_MESSAGE *, const unsigned char *, size_t); +extern ARC_STAT arc_header_field(ARC_MESSAGE *, const char *, size_t); /* ** ARC_EOH -- declare no more headers are coming @@ -453,9 +448,7 @@ extern ARC_STAT arc_eoh(ARC_MESSAGE *); ** A ARC_STAT_* constant. */ -extern ARC_STAT arc_body(ARC_MESSAGE *msg, - const unsigned char *buf, - size_t len); +extern ARC_STAT arc_body(ARC_MESSAGE *, const unsigned char *, size_t); /* ** ARC_EOM -- declare end of message @@ -510,7 +503,7 @@ extern ARC_STAT arc_getseal(ARC_MESSAGE *, const char *, const unsigned char *, size_t, - const unsigned char *); + const char *); /* ** ARC_HDR_NAME -- extract name from an ARC_HDRFIELD @@ -523,7 +516,7 @@ extern ARC_STAT arc_getseal(ARC_MESSAGE *, ** Header field name stored in the object. */ -extern unsigned char *arc_hdr_name(ARC_HDRFIELD *, size_t *); +extern char *arc_hdr_name(ARC_HDRFIELD *, size_t *); /* ** ARC_HDR_VALUE -- extract value from an ARC_HDRFIELD @@ -535,7 +528,7 @@ extern unsigned char *arc_hdr_name(ARC_HDRFIELD *, size_t *); ** Header field value stored in the object. */ -extern unsigned char *arc_hdr_value(ARC_HDRFIELD *); +extern char *arc_hdr_value(ARC_HDRFIELD *); /* ** ARC_HDR_NEXT -- return pointer to next ARC_HDRFIELD @@ -605,9 +598,7 @@ extern const char *arc_chain_status_str(ARC_MESSAGE *msg); ** argument, then buffer was too small and output was truncated. */ -extern int arc_chain_custody_str(ARC_MESSAGE *msg, - unsigned char *buf, - size_t buflen); +extern int arc_chain_custody_str(ARC_MESSAGE *, char *, size_t); /* ** ARC_CHAIN_OLDEST_PASS -- retrieve the oldest-pass value diff --git a/openarc/openarc.c b/openarc/openarc.c index 599ee41..7301447 100644 --- a/openarc/openarc.c +++ b/openarc/openarc.c @@ -3145,15 +3145,15 @@ mlfi_header(SMFICTX *ctx, char *headerf, char *headerv) sfsistat mlfi_eoh(SMFICTX *ctx) { - char last; - unsigned int mode; - ARC_STAT status; - connctx cc; - msgctx afc; - char *p; - const unsigned char *err = NULL; - struct arcf_config *conf; - Header hdr; + char last; + unsigned int mode; + ARC_STAT status; + connctx cc; + msgctx afc; + char *p; + const char *err = NULL; + struct arcf_config *conf; + Header hdr; assert(ctx != NULL); @@ -3427,10 +3427,9 @@ mlfi_eoh(SMFICTX *ctx) last = *p; } - status = arc_header_field( - afc->mctx_arcmsg, - (unsigned char *) arc_dstring_get(afc->mctx_tmpstr), - arc_dstring_len(afc->mctx_tmpstr)); + status = arc_header_field(afc->mctx_arcmsg, + arc_dstring_get(afc->mctx_tmpstr), + arc_dstring_len(afc->mctx_tmpstr)); if (status != ARC_STAT_OK) { if (conf->conf_dolog) @@ -3618,7 +3617,7 @@ mlfi_eom(SMFICTX *ctx) struct sockaddr *ip; Header hdr; struct authres ar; - unsigned char arcchainbuf[ARC_MAXHEADER + 1]; + char arcchainbuf[ARC_MAXHEADER + 1]; char ipbuf[INET6_ADDRSTRLEN]; assert(ctx != NULL); @@ -3793,12 +3792,12 @@ mlfi_eom(SMFICTX *ctx) ** Get the seal fields to apply. */ - status = arc_getseal( - afc->mctx_arcmsg, &seal, conf->conf_authservid, conf->conf_selector, - conf->conf_domain, conf->conf_keydata, conf->conf_keylen, - arc_dstring_len(afc->mctx_tmpstr) > 0 - ? (unsigned char *) arc_dstring_get(afc->mctx_tmpstr) - : NULL); + status = arc_getseal(afc->mctx_arcmsg, &seal, conf->conf_authservid, + conf->conf_selector, conf->conf_domain, + conf->conf_keydata, conf->conf_keylen, + arc_dstring_len(afc->mctx_tmpstr) > 0 + ? arc_dstring_get(afc->mctx_tmpstr) + : NULL); if (status != ARC_STAT_OK) { if (conf->conf_dolog) @@ -3817,11 +3816,10 @@ mlfi_eom(SMFICTX *ctx) char hfname[BUFRSZ + 1]; memset(hfname, '\0', sizeof hfname); - strlcpy(hfname, (char *) arc_hdr_name(sealhdr, &len), - sizeof hfname); + strlcpy(hfname, arc_hdr_name(sealhdr, &len), sizeof hfname); hfname[len] = '\0'; - hfvalue = (char *) arc_hdr_value(sealhdr); + hfvalue = arc_hdr_value(sealhdr); if (!cc->cctx_noleadspc) { /* strip off the leading space */ @@ -3872,7 +3870,7 @@ mlfi_eom(SMFICTX *ctx) if (conf->conf_finalreceiver && arcchainlen > 0) { - bool quote = !ares_istoken((char *) arcchainbuf); + bool quote = !ares_istoken(arcchainbuf); arc_dstring_printf(afc->mctx_tmpstr, " arc.chain=%s%s%s", quote ? "\"" : "", arcchainbuf,