--- gvpe/src/vpn_dns.C 2011/10/18 11:11:32 1.55 +++ gvpe/src/vpn_dns.C 2011/10/18 13:24:01 1.56 @@ -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]; } @@ -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,7 +396,8 @@ return true; } -vpn_packet *byte_stream::get () +vpn_packet * +byte_stream::get () { unsigned int len; @@ -412,7 +412,7 @@ break; // TODO: handle this better than skipping, e.g. by reset - slog (L_DEBUG, _("DNS: corrupted packet (%02x %02x) stream skipping a byte..."), data [0], data [1]); + slog (L_DEBUG, _("DNS: corrupted packet (%02x %02x > %d) stream skipping a byte..."), data [0], data [1], MAXSIZE); remove (1); }