ns_parserr: длинное сообщение;сообщение об ошибке при использовании библиотечной функции резолвера BIND ns_parserr () - PullRequest
0 голосов
/ 12 марта 2011

Предполагается, что приведенный ниже код распечатывает записи ресурсов TXT, которые есть в моем файле зоны
Когда я выполняю код только с BLOCK 1 (BLOCK 2 отсутствует), я получаю имя, тип, класс, TTL и длину данных для каждого из 3 RX TXT, которые у меня есть.
Но когда я выполняю код только с BLOCK 2, я получаю только ответ для первого TXT RR и затем сообщение об ошибке: ns_parserr: Message to long.
Может кто-нибудь, пожалуйста, помогите мне с этой проблемой.
Заранее спасибо.

    int rrnum;  /* resource record number */
    ns_rr rr;   /* expanded resource record */
    for(rrnum = 0; rrnum < ns_msg_count(handle, ns_s_an); rrnum++)
    {
    //from section ns_s_an(ANSWER) take out answer number rrnum and put it in rr        
    if (ns_parserr(&handle, ns_s_an, rrnum, &rr)) {
        fprintf(stderr, "ns_parserr: %s\n", strerror(errno));
    }
    if (ns_rr_type(rr)==ns_t_txt){  
        //BLOCK 1
                    char *cp;
        cp=(char *)ns_rr_name(rr);
        printf("CP->%s\n",(char *)cp);
        int i1=ns_rr_type(rr);
        printf("Type->%d\n", i1);
        int i2=ns_rr_class(rr);
        printf("Class->%d\n", i2);      
        int i3=ns_rr_ttl(rr);
        printf("TTL->%d\n", i3);
        int i4=ns_rr_rdlen(rr);
        printf("Data Length->%d\n\n", i4);

                    //BLOCK 2
        u_char const *rdata=ns_rr_rdata(rr);
        printf("Data->%s\n",(u_char *)rdata);
        char *rdatatemp;
        rdatatemp=(char *)rdata;
        int len=strlen(rdata);
        printf("%d\n",len);
        rdatatemp[strlen(rdata)-2]='\0';
        printf("Data->%s\n",(u_char *)rdatatemp);   
    }
}

Это результат, который я получаю с двумя блоками:
vanco @ vanco-laptop: ~ / Desktop $ gcc d2ip.c /usr/lib/libresolv.a
vanco @ vanco-laptop: ~ / Desktop $ ./a.out www.example.com
СР-> www.example.com
Тип-> 16
Class-> 1
TTL-> 10800
Длина данных-> 41

Данные -> (ver = dgw1 pre = 8 id = 0 name = www.example.com

43
Данные -> (ver = dgw1 pre = 8 id = 0 name = www.example.com
ns_parserr: сообщение слишком длинное

1 Ответ

0 голосов
/ 12 марта 2011

Вы модифицируете память, на которую указывает u_char const *, возвращаемый ns_rr_rdata(rr);, обходя const с использованием приведения

u_char const *rdata=ns_rr_rdata(rr);
...
char *rdatatemp;
rdatatemp=(char *)rdata;
...
rdatatemp[strlen(rdata)-2]='\0';

Вам необходимо выделить новый массив символов и скопировать изrdata

...