Package: nstx Version: 1.1-beta6-5 Severity: normal Tags: patch upstream Hello,
nstx uses base64 encoding, which produces '_' characters, which is not valid in a domain name. To get more DNS server coverage, I have patched my version into using base32, here is my (tested) patch, in case it can be useful more broadly. Samuel -- System Information: Debian Release: squeeze/sid APT prefers testing APT policy: (990, 'testing'), (500, 'unstable'), (500, 'stable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 2.6.31 (SMP w/2 CPU cores) Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages nstx depends on: ii adduser 3.111 add and remove users and groups ii libc6 2.9-25 GNU C Library: Shared libraries nstx recommends no packages. nstx suggests no packages. -- no debconf information
diff -ur nstx-1.1-beta6/nstx_encode.c /home/samy/src/nstx-1.1-beta6/nstx_encode.c --- nstx-1.1-beta6/nstx_encode.c 2009-10-30 00:49:24.000000000 +0100 +++ /home/samy/src/nstx-1.1-beta6/nstx_encode.c 2009-10-29 04:24:31.000000000 +0100 @@ -23,9 +23,16 @@ #include <string.h> #include <stdlib.h> +#include <stdio.h> + +//#define base64 unsigned char map[] = +#ifdef base64 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_1234567890"; +#else + "abcdefghijklmnopqrstuvABCDEFGHIJ"; +#endif unsigned char *revmap = NULL; void init_revmap (void) @@ -43,21 +50,44 @@ int i = 0, off = 1, cut = 0; static unsigned char *buf = NULL; +#ifdef base64 if (len % 3) cut = 3 - len%3; +#else + if (len % 5) + cut = 5 - len%5; +#endif +#ifdef base64 buf = realloc(buf, ((len+2)/3)*4+2); +#else + buf = realloc(buf, ((len+4)/5)*8+2); +#endif buf[0] = map[cut]; while (i < len) { - buf[off + 0] = map[(data[i] & 252) >> 2]; - buf[off + 1] = map[((data[i] & 3) << 4) | ((data[i+1] & 240) >> 4)]; - buf[off + 2] = map[((data[i+1] & 15) << 2 ) | ((data[i+2] & 192) >> 6)]; - buf[off + 3] = map[(data[i+2] & 63)]; +#ifdef base64 + buf[off + 0] = map[(data[i] & 0xfc) >> 2]; + buf[off + 1] = map[((data[i] & 3) << 4) | ((data[i+1] & 0xf0) >> 4)]; + buf[off + 2] = map[((data[i+1] & 0xf) << 2 ) | ((data[i+2] & 0xc0) >> 6)]; + buf[off + 3] = map[(data[i+2] & 0x3f)]; i += 3; off += 4; +#else + buf[off + 0] = map[(data[i] & 0xf8) >> 3]; + buf[off + 1] = map[((data[i] & 7) << 2) | ((data[i+1] & 0xc0) >> 6)]; + buf[off + 2] = map[((data[i+1] & 0x3e) >> 1)]; + buf[off + 3] = map[((data[i+1] & 0x1) << 4) | ((data[i+2] & 0xf0) >> 4)]; + buf[off + 4] = map[((data[i+2] & 0xf) << 1) | ((data[i+3] & 0x80) >> 7)]; + buf[off + 5] = map[((data[i+3] & 0x7c) >> 2)]; + buf[off + 6] = map[((data[i+3] & 0x3) << 3) | ((data[i+4] & 0xe0) >> 5)]; + buf[off + 7] = map[((data[i+4] & 0x1f))]; + i += 5; + off += 8; +#endif } buf[off] = '\0'; + //printf("encoded %d into %s\n", len, buf); return buf; } @@ -72,14 +102,32 @@ len = strlen((char*)data); +#ifdef base64 buf = realloc(buf, ((len+3)/4)*3); +#else + buf = realloc(buf, ((len+7)/8)*5); +#endif +#ifdef base64 while (off+3 < len) { - buf[i+0] = (revmap[data[off]]<<2)|((revmap[data[off+1]]&48)>>4); +#else + while (off+7 < len) { +#endif +#ifdef base64 + buf[i+0] = (revmap[data[off]]<<2)|((revmap[data[off+1]]&0x30)>>4); buf[i+1] = ((revmap[data[off+1]]&15)<<4)|((revmap[data[off+2]]&60)>>2); buf[i+2] = ((revmap[data[off+2]]&3)<<6)|(revmap[data[off+3]]); i += 3; off += 4; +#else + buf[i+0] = (revmap[data[off]]<<3)|((revmap[data[off+1]]&0x1c)>>2); + buf[i+1] = ((revmap[data[off+1]]&0x3)<<6)|((revmap[data[off+2]])<<1)|((revmap[data[off+3]]&0x10)>>4); + buf[i+2] = ((revmap[data[off+3]]&0xf)<<4)|((revmap[data[off+4]]&0x1e)>>1); + buf[i+3] = ((revmap[data[off+4]]&0x1)<<7)|((revmap[data[off+5]])<<2)|((revmap[data[off+6]]&0x18)>>3); + buf[i+4] = ((revmap[data[off+6]]&0x7)<<5)|((revmap[data[off+7]])); + i += 5; + off += 8; +#endif } *rlen = i - revmap[data[0]]; diff -ur nstx-1.1-beta6/nstx_dns.c /home/samy/src/nstx-1.1-beta6/nstx_dns.c --- nstx-1.1-beta6/nstx_dns.c 2009-10-30 00:49:24.000000000 +0100 +++ /home/samy/src/nstx-1.1-beta6/nstx_dns.c 2009-10-29 05:22:54.000000000 +0100 @@ -603,9 +607,9 @@ } else if (type == DNS_QUERY) { // ret = ((raw-suffixlen)*189-759)/256; - ret = (189*(254-suffixlen))/256-6; - if (ret > (maxq = (183-(189*suffixlen)/256))) - ret = maxq; + ret = (150*(254-suffixlen))/256-6; + //if (ret > (maxq = (183-(189*suffixlen)/256))) + // ret = maxq; } return (ret > 0) ? ret : 0;