最近改写一个dns-flood的程序为多线程模式,发现每个线程中生成的随机数字经常是一样 。
void nameformat(char *name, char *QS)
{
char *bungle, *x;
char elem[128];
*QS = 0;
bungle = malloc(strlen(name) + 3);
strcpy(bungle, name);
x = strtok(bungle, ".");
while (x != NULL) {
if (snprintf(elem, 128, "%c%s", strlen(x), x) == 128) {
puts("String overflow.");
exit(1);
}
strcat(QS, elem);
x = strtok(NULL, ".");
}
free(bungle);
}
该函数是在构造DNS请求报文中被调用,通过传入指针name将字符串复制到QS指向的地址内。debug发现QS经常打印出来和name不一样,查了发现strtok不是线程安全的,改用strtok_r后终于OK了。
void nameformat_r(char *name, char *QS)
{
char *bungle, *x;
char elem[128];
char *flag;
*QS = 0;
bungle = malloc(strlen(name) + 3);
strcpy(bungle, name);
x = strtok_r(bungle, ".", &flag);
while (x != NULL) {
if (snprintf(elem, 128, "%c%s", strlen(x), x) == 128) {
puts("String overflow.");
exit(1);
}
strcat(QS, elem);
x = strtok_r(NULL, ".", &flag);
}
free(bungle);
}