diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2013-09-06 17:32:04 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2013-09-06 17:32:04 +0000 |
commit | bd28ac98ded17e44c66d4b8b7e6a739b45dc8ae0 (patch) | |
tree | 8590864529e01070f084a7aa09a19639fd181ab8 | |
parent | fa1e5e31132be81e2605706a43a59227a4041f42 (diff) |
Fixed dangling pointer which probably explain the crash at libhttrack.so:0x639d0
-rw-r--r-- | src/htsback.c | 69 | ||||
-rw-r--r-- | src/htslib.c | 48 | ||||
-rw-r--r-- | src/htslib.h | 3 |
3 files changed, 49 insertions, 71 deletions
diff --git a/src/htsback.c b/src/htsback.c index ccfdba1..dfb522f 100644 --- a/src/htsback.c +++ b/src/htsback.c @@ -2147,10 +2147,10 @@ typedef struct { } HostlookupStruct; void Hostlookup(void *pP) { HostlookupStruct *str = (HostlookupStruct *) pP; + httrackp *const opt = str->opt; char iadr[256]; - t_dnscache *cache = _hts_cache(str->opt); // adresse du cache t_hostent *hp; - int error_found = 0; + t_fullhostent fullhostent_buffer; // recopier (après id:pass) #if DEBUGDNS @@ -2164,49 +2164,49 @@ void Hostlookup(void *pP) { if ((a = jump_toport(iadr))) *a = '\0'; // get rid of it } - freet(pP); - hts_mutexlock(&dns_lock); + // resolve + hp = vxgethostbyname(iadr, &fullhostent_buffer); + + // found + if (hp != NULL) { + t_dnscache *cache; + int error_found = 0; + + hts_mutexlock(&opt->state.lock); - while(cache->n) { + for(cache = _hts_cache(opt); cache->n != NULL; cache = cache->n) { + if (strcmp(cache->iadr, iadr) == 0) { + error_found = 1; + } + } if (strcmp(cache->iadr, iadr) == 0) { error_found = 1; } - cache = cache->n; // calculer queue - } - if (strcmp(cache->iadr, iadr) == 0) { - error_found = 1; - } - if (!error_found) { - // en gros copie de hts_gethostbyname sans le return - cache->n = (t_dnscache *) calloct(1, sizeof(t_dnscache)); - if (cache->n != NULL) { - t_fullhostent fullhostent_buffer; + if (!error_found) { + // en gros copie de hts_gethostbyname sans le return + cache->n = (t_dnscache *) calloct(1, sizeof(t_dnscache)); + if (cache->n != NULL) { + strcpybuff(cache->n->iadr, iadr); + cache->n->host_length = 0; /* pour le moment rien */ + cache->n->n = NULL; - strcpybuff(cache->n->iadr, iadr); - cache->n->host_length = 0; /* pour le moment rien */ - cache->n->n = NULL; - - /* resolve */ -#if DEBUGDNS - printf("gethostbyname() in progress for %s\n", iadr); -#endif - cache->n->host_length = -1; - memset(cache->n->host_addr, 0, sizeof(cache->n->host_addr)); - hp = vxgethostbyname(iadr, &fullhostent_buffer); - if (hp != NULL) { + cache->n->host_length = -1; + memset(cache->n->host_addr, 0, sizeof(cache->n->host_addr)); memcpy(cache->n->host_addr, hp->h_addr, hp->h_length); cache->n->host_length = hp->h_length; } - } - } else { + } else { #if DEBUGDNS - printf("aborting resolv for %s (found)\n", iadr); + printf("aborting resolv for %s (found)\n", iadr); #endif + } + + hts_mutexrelease(&opt->state.lock); } - hts_mutexrelease(&dns_lock); + freet(pP); #if DEBUGDNS printf("quitting resolv for %s (result: %d)\n", iadr, @@ -2250,9 +2250,6 @@ void back_solve(httrackp * opt, lien_back * back) { hts_newthread(Hostlookup, str); } } -#else - /*t_hostent* h= */ - /*hts_gethostbyname(a); */// calcul #endif #else #if USE_BEGINTHREAD @@ -2262,10 +2259,6 @@ void back_solve(httrackp * opt, lien_back * back) { strcpybuff(p, a); hts_newthread(Hostlookup, p); } -#else - // Sous Unix, le gethostbyname() est bloquant.. - /*t_hostent* h= */ - /*hts_gethostbyname(a); */// calcul #endif #endif } diff --git a/src/htslib.c b/src/htslib.c index ff8ec72..2c61ec2 100644 --- a/src/htslib.c +++ b/src/htslib.c @@ -4616,18 +4616,11 @@ void hts_cache_free(t_dnscache * cache) { // plus prudent quand plusieurs threads peuvent écrire dedans.. // -1: status? 0: libérer 1:locker -/* - Simple lock for cache -*/ -htsmutex dns_lock = HTSMUTEX_INIT; - +// MUST BE LOCKED // routine pour le cache - retour optionnel à donner à chaque fois // NULL: nom non encore testé dans le cache // si h_length==0 alors le nom n'existe pas dans le dns -t_hostent *_hts_ghbn(t_dnscache * cache, const char *iadr, t_hostent * retour) { - t_hostent *ret = NULL; - - hts_mutexlock(&dns_lock); +static t_hostent *hts_ghbn(t_dnscache * cache, const char *iadr, t_hostent * retour) { for(; cache != NULL; cache = cache->n) { if (strcmp(cache->iadr, iadr) == 0) { // ok trouvé if (cache->host_length > 0) { // entrée valide @@ -4635,19 +4628,16 @@ t_hostent *_hts_ghbn(t_dnscache * cache, const char *iadr, t_hostent * retour) { memcpy(retour->h_addr_list[0], cache->host_addr, cache->host_length); retour->h_length = cache->host_length; } else if (cache->host_length == 0) { // en cours - ret = NULL; - break; + return NULL; } else { // erreur dans le dns, déja vérifié if (retour->h_addr_list[0]) retour->h_addr_list[0][0] = '\0'; retour->h_length = 0; // erreur, n'existe pas } - ret = retour; - break; + return retour; } } - hts_mutexrelease(&dns_lock); - return ret; + return NULL; } // tester si iadr a déja été testé (ou en cours de test) @@ -4676,14 +4666,14 @@ int hts_dnstest(httrackp * opt, const char *_iadr) { #endif return 1; - hts_mutexlock(&dns_lock); + hts_mutexlock(&opt->state.lock); for(cache = _hts_cache(opt); cache != NULL; cache = cache->n) { if (strcmp(cache->iadr, iadr) == 0) { // ok trouvé ret = 1; break; } } - hts_mutexrelease(&dns_lock); + hts_mutexrelease(&opt->state.lock); return ret; } @@ -4774,8 +4764,9 @@ HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer) { return vxgethostbyname2(hostname, v_buffer, NULL); } +// Needs locking // cache dns interne à HTS // ** FREE A FAIRE sur la chaine -t_hostent *hts_gethostbyname2(httrackp * opt, const char *_iadr, void *v_buffer, const char **error) { +static t_hostent *hts_gethostbyname_(httrackp * opt, const char *_iadr, void *v_buffer, const char **error) { char BIGSTK iadr[HTS_URLMAXSIZE * 2]; t_fullhostent *buffer = (t_fullhostent *) v_buffer; t_dnscache *cache = _hts_cache(opt); // adresse du cache @@ -4793,19 +4784,8 @@ t_hostent *hts_gethostbyname2(httrackp * opt, const char *_iadr, void *v_buffer, *a = '\0'; } - // effacer structure de retour, créer nouvelle - /* - memset(&host, 0, sizeof(t_hostent)); - host.h_addr_list=he; - he[0]=NULL; - he[1]=NULL; - host.h_length=0; - */ - cache->iadr[0] = '*'; - cache->iadr[1] = '\0'; - /* get IP from the dns cache */ - hp = _hts_ghbn(cache, iadr, &buffer->hp); + hp = hts_ghbn(cache, iadr, &buffer->hp); if (hp) { if (hp->h_length > 0) return hp; @@ -4860,6 +4840,14 @@ t_hostent *hts_gethostbyname2(httrackp * opt, const char *_iadr, void *v_buffer, } // retour hp du cache } +t_hostent *hts_gethostbyname2(httrackp * opt, const char *_iadr, void *v_buffer, const char **error) { + t_hostent *ret; + hts_mutexlock(&opt->state.lock); + ret = hts_gethostbyname_(opt, _iadr, v_buffer, error); + hts_mutexrelease(&opt->state.lock); + return ret; +} + t_hostent *hts_gethostbyname(httrackp * opt, const char *_iadr, void *v_buffer) { return hts_gethostbyname2(opt ,_iadr, v_buffer, NULL); } diff --git a/src/htslib.h b/src/htslib.h index b299074..6760fb7 100644 --- a/src/htslib.h +++ b/src/htslib.h @@ -229,8 +229,6 @@ struct t_dnscache { /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE -extern htsmutex dns_lock; - // initialize an htsblk structure void hts_init_htsblk(htsblk * r); @@ -299,7 +297,6 @@ HTS_INLINE t_hostent *hts_gethostbyname(httrackp * opt, const char *iadr, HTSEXT_API t_hostent *vxgethostbyname2(char *hostname, void *v_buffer, const char **error); HTSEXT_API t_hostent *vxgethostbyname(char *hostname, void *v_buffer); #endif -t_hostent *_hts_ghbn(t_dnscache * cache, const char *iadr, t_hostent * retour); int ftp_available(void); #if HTS_DNSCACHE |