realloc(): invalid next size (libcurl)



  • Das Programm weiter unten soll URLs auslesen.
    Das funktioniert manchmal, manchmal auch nicht.
    Scheinbar hängt das nur davon ab, welche URL man angibt.
    Wenn man die URL im Code durch "http://www.google.de" ersetzt,
    tut das Programm, was es soll. Wenn man es dagegen so ausführt,
    wie es jetzt ist:
    [CODE}*** glibc detected *** realloc(): invalid next size: 0x0806f648 ***[/CODE]

    Bevor ich verzweifle und als C-Neuling alles wieder in den Sand werfe: HILFE!

    Quellcode:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
    
    #define USERAGENT Mozilla/5.0
    
    struct data
    {
      char *data;
      size_t size;
    };
    
    struct sitecontent
    {
      char *header;
      char *body;
    };
    
    struct sitecontent *newSitecontent(char *header,char *body)
    {
      struct sitecontent *sitecnt = malloc(sizeof(struct sitecontent));
      if (!sitecnt)
      ;
        //ERROR
      sitecnt->header = header;
      sitecnt->body = body;
      return(sitecnt);
    } 
    
    void deleteSitecontent(struct sitecontent *object)
    {
      free(object->header);
      free(object->body);
      free(object);
    }
    
    //---------------------------------------------------------------------------------------------
    size_t saverecdata(void *ptr,size_t size,size_t nmemb,void *buffer)
    {
      struct data *data = (struct data *)buffer;
      size_t realsize = size * nmemb;
      data->data = realloc(data->data,data->size + (sizeof(char) * (realsize + 1)));
      data->data = strncat(data->data,ptr,realsize);
      data->size += realsize;
      return(realsize);
    }
    
    struct sitecontent *geturl(CURL *handle,char *site,char *options)
    {
      struct data body;
      struct data header;
      body.data = NULL;
      body.size = 0;
      header.data = NULL;
      header.size = 0;
      curl_easy_setopt(handle,CURLOPT_URL,site);
      curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION,saverecdata);
      curl_easy_setopt(handle,CURLOPT_WRITEDATA,(void *)&body);
      curl_easy_setopt(handle,CURLOPT_HEADERFUNCTION,saverecdata);
      curl_easy_setopt(handle,CURLOPT_WRITEHEADER,(void *)&header);
      curl_easy_perform(handle);
      struct sitecontent *content = newSitecontent(header.data,body.data);
      return(content);
    }
    
    int main()
    {
      CURL *chandle;
      curl_global_init(CURL_GLOBAL_ALL);
      chandle = curl_easy_init();
      struct sitecontent *inhalt = geturl(chandle,"http://www.google.de/advanced_search?hl=de","");
      printf("HEADER\n%s\n",inhalt->header);
      deleteSitecontent(inhalt);
      curl_easy_cleanup(chandle);
      return(0);
    }
    

    [url]http://nopaste.info/9bc0be242a_nl.html[/url}



  • Was macht denn die Funktion curl_easy_setopt?

    Und ist in dieser Zeile

    data->data = strncat(data->data,ptr,realsize);
    

    zu jeder Zeit sichergestellt, dass data->data ein gültiger C-String ist?


Anmelden zum Antworten