Bug#553297: nstx: Uses non-standard '_' in domain names
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;
Reply to: