chiark / gitweb /
reverse parsing: Pass dgram and labstart instead of label
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 23 Jul 2014 21:58:03 +0000 (22:58 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 19 Oct 2014 20:14:55 +0000 (21:14 +0100)
We are going to want to deal with labstart and dgram separately.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/addrfam.c
src/internal.h
src/query.c
src/types.c

index 7153b2667231066e4633580637539f4bd79d09b5..d087016247dfef865b19afd6ce4ff9fe6695b5b4 100644 (file)
@@ -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;
index 18aabf48b3fab177ee6ea7565cbd6e865c8e97d7..5312fe1ac1520f1ea3241c340e2ceca09750ff0e 100644 (file)
@@ -199,7 +199,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
@@ -231,7 +232,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 */
@@ -472,7 +473,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
@@ -482,7 +484,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
index a0723a5c41ef152d06c42ba879c1be3a097a3a37..d6271a39e8b8e80fb1bf77dcf8480c933179322e 100644 (file)
@@ -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<lablen; i++) {
@@ -141,7 +142,7 @@ static adns_status check_domain_name(adns_state ads, adns_queryflags flags,
     err= adns__findlabel_next(&fls, &lablen,&labstart);
     assert(!err); assert(lablen >= 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;
index 8b9723e1e34f3774ca9bf54fc57048f71c157017..ae43e2e26ba2150132c03d22163386c32b05d86d 100644 (file)
@@ -1135,12 +1135,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;
@@ -1418,12 +1419,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,