summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXavier Roche <xroche@users.noreply.github.com>2013-09-06 17:32:04 +0000
committerXavier Roche <xroche@users.noreply.github.com>2013-09-06 17:32:04 +0000
commitbd28ac98ded17e44c66d4b8b7e6a739b45dc8ae0 (patch)
tree8590864529e01070f084a7aa09a19639fd181ab8 /src
parentfa1e5e31132be81e2605706a43a59227a4041f42 (diff)
Fixed dangling pointer which probably explain the crash at libhttrack.so:0x639d0
Diffstat (limited to 'src')
-rw-r--r--src/htsback.c69
-rw-r--r--src/htslib.c48
-rw-r--r--src/htslib.h3
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