aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-05-26 06:02:50 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-05-26 06:02:50 +0000
commitfeffa899990da7d1d113894daaac6ed3d15031ad (patch)
tree6343fb3c53b584809317f30053e1172f69c8bb1c
parent27fbd3626d5507f458c1233f4b66df36a11d60c5 (diff)
downloadshibari-feffa899990da7d1d113894daaac6ed3d15031ad.tar.gz
fix wildcard handling (and also the bug we just introduced)
-rw-r--r--src/server/shibari_packet_add_rr.c7
-rw-r--r--src/server/shibari_packet_tdb_answer_query.c6
-rw-r--r--src/server/shibari_tdb_read_entry.c3
3 files changed, 6 insertions, 10 deletions
diff --git a/src/server/shibari_packet_add_rr.c b/src/server/shibari_packet_add_rr.c
index b92e8dd..62712fa 100644
--- a/src/server/shibari_packet_add_rr.c
+++ b/src/server/shibari_packet_add_rr.c
@@ -12,13 +12,8 @@
int shibari_packet_add_rr (shibari_packet *p, shibari_tdb_entry const *entry, int prefixlen, uint16_t offset, unsigned int section)
{
uint16_t *count[4] = { &p->hdr.counts.qd, &p->hdr.counts.an, &p->hdr.counts.ns, &p->hdr.counts.nr } ;
- uint16_t rrlen = 10 + entry->data.len + (entry->flags & 1 ? 2 : 0) + (prefixlen >= 0 ? prefixlen + 2 : entry->key.len) ;
+ uint16_t rrlen = 10 + entry->data.len + (prefixlen >= 0 ? prefixlen + 2 : entry->key.len) ;
if (p->max - p->pos < rrlen) return 0 ;
- if (entry->flags & 1)
- {
- p->buf[p->pos++] = 1 ;
- p->buf[p->pos++] = '*' ;
- }
if (prefixlen >= 0)
{
memcpy(p->buf + p->pos, entry->key.s, prefixlen) ;
diff --git a/src/server/shibari_packet_tdb_answer_query.c b/src/server/shibari_packet_tdb_answer_query.c
index 74b08a2..a57eb79 100644
--- a/src/server/shibari_packet_tdb_answer_query.c
+++ b/src/server/shibari_packet_tdb_answer_query.c
@@ -62,7 +62,7 @@ unsigned int shibari_packet_tdb_answer_query (shibari_packet *pkt, cdb const *td
int r = shibari_tdb_read_entry(tdb, &state, &entry, ql.s + wildpos, ql.len - wildpos, qtype, !!wildpos, loc, stamp, &flagyxdomain) ;
if (r == -1) return 2 ;
if (!r) break ;
- if (!shibari_packet_add_rr(pkt, &entry, 0, wildpos, 2))
+ if (!shibari_packet_add_rr(pkt, &entry, 0, 0, 2))
{
pkt->hdr.tc = 1 ;
return 0 ;
@@ -77,8 +77,8 @@ unsigned int shibari_packet_tdb_answer_query (shibari_packet *pkt, cdb const *td
default : break ;
}
}
- if (pkt->hdr.counts.an || flagyxdomain) break ;
- wildpos += 1 + q->s[wildpos] ;
+ if (pkt->hdr.counts.an || flagyxdomain || (ql.s[wildpos] == 1 && ql.s[wildpos+1] == '*')) break ;
+ wildpos += 1 + ql.s[wildpos] ;
}
got:
diff --git a/src/server/shibari_tdb_read_entry.c b/src/server/shibari_tdb_read_entry.c
index 15dd0c2..140e63c 100644
--- a/src/server/shibari_tdb_read_entry.c
+++ b/src/server/shibari_tdb_read_entry.c
@@ -12,11 +12,12 @@ int shibari_tdb_read_entry (cdb const *tdb, cdb_find_state *state, shibari_tdb_e
{
r = cdb_findnext(tdb, &data, s, len, state) ;
if (r <= 0) return r ;
- if (flags && !!wild) *flags |= 1 ;
+ if (flags && !wild) *flags |= 1 ;
r = shibari_tdb_entry_parse(out, data.s, data.len, qtype, wild, loc, stamp) ;
if (r == -1) return -1 ;
}
out->key.s = s ;
out->key.len = len ;
+ if (flags) *flags |= 1 ;
return 1 ;
}