diff -urpN memdbg2/src/rules.c memdbg1/src/rules.c --- memdbg2/src/rules.c 2013-05-17 20:54:32.781250000 -0500 +++ memdbg1/src/rules.c 2013-05-17 21:25:50.500000000 -0500 @@ -247,7 +247,7 @@ static void rules_init_class(char name, /* allocation was removed (JimF, 2013) */ char *userclass_expand(const char *src) { - unsigned char _src2[0x100], *src2=_src2; + unsigned char _src2[0x100], *src2=_src2, dst_seen[0x100]; char dst_tmp[0x200]; char *dst = dst_tmp, *dstend = &dst_tmp[0x100]; int j, br = 0; @@ -267,11 +267,15 @@ char *userclass_expand(const char *src) dst = dst_tmp; // pass 2: parse ranges between brackets + memset(dst_seen, 0, sizeof(dst_seen)); while(*src2 && dst < dstend) { if (*src2 == '\\') { if (src2[1]) { - *dst++ = *++src2; - src2++; + if (dst_seen[src2[1]] == 0) { + *dst++ = src2[1]; + dst_seen[src2[1]] = 1; + } + src2 += 2; continue; } else { return NULL; @@ -291,18 +295,35 @@ char *userclass_expand(const char *src) continue; } if (*src2 == '-' && src2[1] && src2[1] != ']') { - if (src2[-1] < src2[1]) - for (j=src2[-1] + 1; j < src2[1]; j++) - *dst++ = j; - else - for (j=src2[-1] - 1; j > src2[1]; j--) - *dst++ = j; - *dst++ = *++src2; - src2++; + if (src2[-1] < src2[1]) { + for (j=src2[-1] + 1; j < src2[1]; j++) { + if (dst_seen[j] == 0) { + *dst++ = j; + dst_seen[j] = 1; + } + } + } else { + for (j=src2[-1] - 1; j > src2[1]; j--) { + if (dst_seen[j] == 0) { + *dst++ = j; + dst_seen[j] = 1; + } + } + } + ++src2; + if (dst_seen[*src2] == 0) { + *dst++ = *src2; + dst_seen[*src2] = 1; + } + ++src2; continue; } } - *dst++ = *src2++; + if (dst_seen[*src2] == 0) { + *dst++ = *src2; + dst_seen[*src2] = 1; + } + ++src2; } *dst = 0; if (br) {