ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/vpn_dns.C
(Generate patch)

Comparing gvpe/src/vpn_dns.C (file contents):
Revision 1.55 by root, Tue Oct 18 11:11:32 2011 UTC vs.
Revision 1.56 by root, Tue Oct 18 13:24:01 2011 UTC

146 assert (size < 256); 146 assert (size < 256);
147} 147}
148 148
149#define MAX_DEC_LEN 500 149#define MAX_DEC_LEN 500
150#define MAX_ENC_LEN (MAX_DEC_LEN * 2) 150#define MAX_ENC_LEN (MAX_DEC_LEN * 2)
151#define MAX_LIMBS ((MAX_DEC_LEN * 8 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS) 151#define MAX_LIMBS ((MAX_DEC_LEN * 8 + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS + 1)
152 152
153// ugly. minimum base is 16(!) 153// ugly. minimum base is 16(!)
154struct basecoder 154struct basecoder
155{ 155{
156 charmap cmap; 156 charmap cmap;
167}; 167};
168 168
169basecoder::basecoder (const char *cmap) 169basecoder::basecoder (const char *cmap)
170: cmap (cmap) 170: cmap (cmap)
171{ 171{
172 int decn = -1;
173
172 for (unsigned int len = 0; len < MAX_DEC_LEN; ++len) 174 for (unsigned int len = 0; len < MAX_DEC_LEN; ++len)
173 { 175 {
174 u8 src [MAX_DEC_LEN]; 176 u8 src [MAX_DEC_LEN];
175 u8 dst [MAX_ENC_LEN]; 177 u8 dst [MAX_ENC_LEN];
176 178
180 mp_size_t n; 182 mp_size_t n;
181 183
182 n = mpn_set_str (m, src, len, 256); 184 n = mpn_set_str (m, src, len, 256);
183 n = mpn_get_str (dst, this->cmap.size, m, n); 185 n = mpn_get_str (dst, this->cmap.size, m, n);
184 186
185 for (int i = 0; !dst [i]; ++i) 187 for (int i = 0; n && !dst [i]; ++i, --n)
186 n--; 188 ;
187 189
188 enc_len [len] = n; 190 enc_len [len] = n;
191 while (decn < n)
189 dec_len [n] = len; 192 dec_len [++decn] = len;
190 } 193 }
191} 194}
192 195
193unsigned int 196unsigned int
194basecoder::encode_len (unsigned int len) const 197basecoder::encode_len (unsigned int len) const
197} 200}
198 201
199unsigned int 202unsigned int
200basecoder::decode_len (unsigned int len) const 203basecoder::decode_len (unsigned int len) const
201{ 204{
202 while (len && !dec_len [len])
203 --len;
204
205 return dec_len [len]; 205 return dec_len [len];
206} 206}
207 207
208unsigned int 208unsigned int
209basecoder::encode (char *dst, u8 *src, unsigned int len) const 209basecoder::encode (char *dst, u8 *src, unsigned int len) const
364} 364}
365 365
366void 366void
367byte_stream::remove (int count) 367byte_stream::remove (int count)
368{ 368{
369 if (count > fill)
370 assert (count <= fill); 369 assert (count <= fill);
371 370
372 memmove (data, data + count, fill -= count); 371 memmove (data, data + count, fill -= count);
373} 372}
374 373
375bool 374bool
395 memcpy (data + fill, pkt->at (0), pkt->len); fill += pkt->len; 394 memcpy (data + fill, pkt->at (0), pkt->len); fill += pkt->len;
396 395
397 return true; 396 return true;
398} 397}
399 398
399vpn_packet *
400vpn_packet *byte_stream::get () 400byte_stream::get ()
401{ 401{
402 unsigned int len; 402 unsigned int len;
403 403
404 for (;;) 404 for (;;)
405 { 405 {
410 410
411 if (len <= MAXSIZE) 411 if (len <= MAXSIZE)
412 break; 412 break;
413 413
414 // TODO: handle this better than skipping, e.g. by reset 414 // TODO: handle this better than skipping, e.g. by reset
415 slog (L_DEBUG, _("DNS: corrupted packet (%02x %02x) stream skipping a byte..."), data [0], data [1]); 415 slog (L_DEBUG, _("DNS: corrupted packet (%02x %02x > %d) stream skipping a byte..."), data [0], data [1], MAXSIZE);
416 remove (1); 416 remove (1);
417 } 417 }
418 418
419 if (fill < len + 2) 419 if (fill < len + 2)
420 return 0; 420 return 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines