From 75aee8cde6bdeb7e7bd8567c40b9c739e468918f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 23 Jul 2014 22:58:03 +0100 Subject: [PATCH] reverse parsing: Pass dgram and labstart instead of label We are going to want to deal with labstart and dgram separately. Signed-off-by: Ian Jackson --- src/addrfam.c | 6 ++++-- src/internal.h | 11 +++++++---- src/query.c | 5 +++-- src/types.c | 13 ++++++++----- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/addrfam.c b/src/addrfam.c index 7153b26..d087016 100644 --- a/src/addrfam.c +++ b/src/addrfam.c @@ -580,7 +580,8 @@ static const struct revparse_domain { ((labnum) ? (rps)->map : (1 << NREVDOMAINS) - 1) int adns__revparse_label(struct revparse_state *rps, int labnum, - const char *label, int lablen) { + const char *dgram, int labstart, int lablen) { + const char *label = dgram+labstart; unsigned f= REVDOMAIN_MAP(rps, labnum); const struct revparse_domain *rpd; const char *tp; @@ -610,7 +611,8 @@ int adns__revparse_label(struct revparse_state *rps, int labnum, return 0; } -int adns__revparse_done(struct revparse_state *rps, int nlabels, +int adns__revparse_done(struct revparse_state *rps, + const char *dgram, int nlabels, adns_rrtype *rrtype_r, adns_sockaddr *addr_r) { unsigned f= REVDOMAIN_MAP(rps, nlabels); const struct revparse_domain *rpd; diff --git a/src/internal.h b/src/internal.h index 55da2b9..49f5e66 100644 --- a/src/internal.h +++ b/src/internal.h @@ -198,7 +198,8 @@ typedef struct typeinfo { adns_status (*checklabel)(adns_state ads, adns_queryflags flags, union checklabel_state *cls, qcontext *ctx, - int labnum, const char *label, int lablen); + int labnum, const char *dgram, + int labstart, int lablen); /* Check a label from the query domain string. The label is not * necessarily null-terminated. The hook can refuse the query's submission * by returning a nonzero status. State can be stored in *cls between @@ -230,7 +231,7 @@ typedef struct typeinfo { adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, union checklabel_state *cls, qcontext *ctx, int labnum, - const char *label, int lablen); + const char *dgram, int labstart, int lablen); /* implemented in query.c, used by types.c as default * and as part of implementation for some fancier types * doesn't require any state */ @@ -467,7 +468,8 @@ extern int adns__make_reverse_domain(const struct sockaddr *sa, */ extern int adns__revparse_label(struct revparse_state *rps, int labnum, - const char *label, int lablen); + const char *dgram, + int labstart, int lablen); /* Parse a label in a reverse-domain name, given its index labnum (starting * from zero), a pointer to its contents (which need not be null-terminated), * and its length. The state in *rps is initialized implicitly when labnum @@ -477,7 +479,8 @@ extern int adns__revparse_label(struct revparse_state *rps, int labnum, * definitely invalid and the parse must be abandoned. */ -extern int adns__revparse_done(struct revparse_state *rps, int nlabels, +extern int adns__revparse_done(struct revparse_state *rps, + const char *dgram, int nlabels, adns_rrtype *rrtype_r, adns_sockaddr *addr_r); /* Finishes parsing a reverse-domain name, given the total number of * labels in the name. On success, fills in the af and protocol diff --git a/src/query.c b/src/query.c index a5882f3..9360fb8 100644 --- a/src/query.c +++ b/src/query.c @@ -111,9 +111,10 @@ static void query_submit(adns_state ads, adns_query qu, adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, union checklabel_state *cls, qcontext *ctx, int labnum, - const char *label, int lablen) + const char *dgram, int labstart, int lablen) { int i, c; + const char *label = dgram+labstart; if (flags & adns_qf_quoteok_query) return adns_s_ok; for (i=0; i= 0); err= typei->checklabel(ads,flags, &cls,ctx, - labnum++, dgram+labstart,lablen); + labnum++, dgram,labstart,lablen); if (err) return err; } while (lablen); return adns_s_ok; diff --git a/src/types.c b/src/types.c index ae977cb..804b3b5 100644 --- a/src/types.c +++ b/src/types.c @@ -1139,12 +1139,13 @@ static adns_status cs_inthost(vbuf *vb, const void *datap) { static adns_status ckl_ptr(adns_state ads, adns_queryflags flags, union checklabel_state *cls, qcontext *ctx, - int labnum, const char *label, int lablen) { + int labnum, const char *dgram, + int labstart, int lablen) { if (lablen) { - if (adns__revparse_label(&cls->ptr, labnum, label,lablen)) + if (adns__revparse_label(&cls->ptr, labnum, dgram,labstart,lablen)) return adns_s_querydomainwrong; } else { - if (adns__revparse_done(&cls->ptr, labnum, + if (adns__revparse_done(&cls->ptr, dgram, labnum, &ctx->tinfo.ptr.rev_rrtype, &ctx->tinfo.ptr.addr)) return adns_s_querydomainwrong; @@ -1423,12 +1424,14 @@ static adns_status cs_soa(vbuf *vb, const void *datap) { static adns_status ckl_srv(adns_state ads, adns_queryflags flags, union checklabel_state *cls, qcontext *ctx, - int labnum, const char *label, int lablen) { + int labnum, const char *dgram, + int labstart, int lablen) { + const char *label = dgram+labstart; if (labnum < 2 && !(flags & adns_qf_quoteok_query)) { if (!lablen || label[0] != '_') return adns_s_querydomaininvalid; return adns_s_ok; } - return adns__ckl_hostname(ads, flags, cls, ctx, labnum, label, lablen); + return adns__ckl_hostname(ads,flags, cls,ctx, labnum, dgram,labstart,lablen); } static adns_status pap_srv_begin(const parseinfo *pai, int *cbyte_io, int max, -- 2.30.2