--- gvpe/src/vpn_dns.C 2011/10/18 10:54:17 1.53 +++ gvpe/src/vpn_dns.C 2022/10/06 03:03:09 1.57 @@ -148,7 +148,7 @@ #define MAX_DEC_LEN 500 #define MAX_ENC_LEN (MAX_DEC_LEN * 2) -#define MAX_LIMBS ((MAX_DEC_LEN * 8 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS) +#define MAX_LIMBS ((MAX_DEC_LEN * 8 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS + 1) // ugly. minimum base is 16(!) struct basecoder @@ -169,6 +169,8 @@ basecoder::basecoder (const char *cmap) : cmap (cmap) { + int decn = -1; + for (unsigned int len = 0; len < MAX_DEC_LEN; ++len) { u8 src [MAX_DEC_LEN]; @@ -182,11 +184,12 @@ n = mpn_set_str (m, src, len, 256); n = mpn_get_str (dst, this->cmap.size, m, n); - for (int i = 0; !dst [i]; ++i) - n--; + for (int i = 0; n && !dst [i]; ++i, --n) + ; enc_len [len] = n; - dec_len [n] = len; + while (decn < n) + dec_len [++decn] = len; } } @@ -199,9 +202,6 @@ unsigned int basecoder::decode_len (unsigned int len) const { - while (len && !dec_len [len]) - --len; - return dec_len [len]; } @@ -311,9 +311,9 @@ seqno &= SEQNO_MASK; u8 hdr[3] = { - seqno, - (seqno >> 8) | (retry << 6), - clientid, + u8 (seqno), + u8 ((seqno >> 8) | (retry << 6)), + u8 (clientid), }; cdc36.encode (data, hdr, 3); @@ -366,8 +366,7 @@ void byte_stream::remove (int count) { - if (count > fill) - assert (count <= fill); + assert (count <= fill); memmove (data, data + count, fill -= count); } @@ -397,19 +396,23 @@ return true; } -vpn_packet *byte_stream::get () +vpn_packet * +byte_stream::get () { unsigned int len; for (;;) { + if (fill < 2) + return 0; + len = (data [0] << 8) | data [1]; - if (len <= MAXSIZE || fill < 2) + if (len <= MAXSIZE) break; // TODO: handle this better than skipping, e.g. by reset - slog (L_DEBUG, _("DNS: corrupted packet stream skipping a byte...")); + slog (L_DEBUG, _("DNS: corrupted packet (%02x %02x > %d) stream skipping a byte..."), data [0], data [1], MAXSIZE); remove (1); }