mirror of
https://github.com/moparisthebest/wget
synced 2024-07-03 16:38:41 -04:00
[svn] Abort on xfree(NULL).
This commit is contained in:
parent
e2e9b753e4
commit
095d89995e
@ -1,3 +1,17 @@
|
|||||||
|
2003-11-02 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
|
* html-url.c (cleanup_html_url): Destroy the hash tables, don't
|
||||||
|
just call free on them.
|
||||||
|
(init_interesting): Use hash_table_put instead of string_set_add
|
||||||
|
because we don't need the strdup that the latter function
|
||||||
|
performs.
|
||||||
|
|
||||||
|
* init.c (cleanup): Don't pass NULL to cookie_jar_delete.
|
||||||
|
|
||||||
|
* xmalloc.c (xfree_real): Abort when passed a NULL pointer.
|
||||||
|
(xfree_debug): Print at the file and line of the offending call to
|
||||||
|
free.
|
||||||
|
|
||||||
2003-11-02 Hrvoje Niksic <hniksic@xemacs.org>
|
2003-11-02 Hrvoje Niksic <hniksic@xemacs.org>
|
||||||
|
|
||||||
* wget.h: Retired the `boolean' type. Moved the DEFAULT_LOGFILE
|
* wget.h: Retired the `boolean' type. Moved the DEFAULT_LOGFILE
|
||||||
|
@ -227,9 +227,10 @@ init_interesting (void)
|
|||||||
/* Add the attributes we care about. */
|
/* Add the attributes we care about. */
|
||||||
interesting_attributes = make_nocase_string_hash_table (10);
|
interesting_attributes = make_nocase_string_hash_table (10);
|
||||||
for (i = 0; i < countof (additional_attributes); i++)
|
for (i = 0; i < countof (additional_attributes); i++)
|
||||||
string_set_add (interesting_attributes, additional_attributes[i]);
|
hash_table_put (interesting_attributes, additional_attributes[i], "1");
|
||||||
for (i = 0; i < countof (tag_url_attributes); i++)
|
for (i = 0; i < countof (tag_url_attributes); i++)
|
||||||
string_set_add (interesting_attributes, tag_url_attributes[i].attr_name);
|
hash_table_put (interesting_attributes,
|
||||||
|
tag_url_attributes[i].attr_name, "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the value of attribute named NAME in the taginfo TAG. If the
|
/* Find the value of attribute named NAME in the taginfo TAG. If the
|
||||||
@ -715,6 +716,10 @@ get_urls_file (const char *file)
|
|||||||
void
|
void
|
||||||
cleanup_html_url (void)
|
cleanup_html_url (void)
|
||||||
{
|
{
|
||||||
xfree_null (interesting_tags);
|
/* Destroy the hash tables. The hash table keys and values are not
|
||||||
xfree_null (interesting_attributes);
|
allocated by this code, so we don't need to free them here. */
|
||||||
|
if (interesting_tags)
|
||||||
|
hash_table_destroy (interesting_tags);
|
||||||
|
if (interesting_attributes)
|
||||||
|
hash_table_destroy (interesting_attributes);
|
||||||
}
|
}
|
||||||
|
@ -1319,7 +1319,8 @@ cleanup (void)
|
|||||||
cleanup_html_url ();
|
cleanup_html_url ();
|
||||||
downloaded_files_free ();
|
downloaded_files_free ();
|
||||||
host_cleanup ();
|
host_cleanup ();
|
||||||
cookie_jar_delete (wget_cookie_jar);
|
if (wget_cookie_jar)
|
||||||
|
cookie_jar_delete (wget_cookie_jar);
|
||||||
|
|
||||||
{
|
{
|
||||||
extern acc_t *netrc_list;
|
extern acc_t *netrc_list;
|
||||||
|
@ -40,11 +40,6 @@ so, delete this exception statement from your version. */
|
|||||||
# define NDEBUG
|
# define NDEBUG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define this if you want primitive but extensive malloc debugging.
|
|
||||||
It will make Wget extremely slow, so only do it in development
|
|
||||||
builds. */
|
|
||||||
#undef DEBUG_MALLOC
|
|
||||||
|
|
||||||
#ifndef PARAMS
|
#ifndef PARAMS
|
||||||
# if PROTOTYPES
|
# if PROTOTYPES
|
||||||
# define PARAMS(args) args
|
# define PARAMS(args) args
|
||||||
|
@ -83,7 +83,7 @@ memfatal (const char *context, long attempted_size)
|
|||||||
#define xmalloc0 xmalloc0_real
|
#define xmalloc0 xmalloc0_real
|
||||||
#define xrealloc xrealloc_real
|
#define xrealloc xrealloc_real
|
||||||
#define xstrdup xstrdup_real
|
#define xstrdup xstrdup_real
|
||||||
#define xfree free
|
#define xfree xfree_real
|
||||||
|
|
||||||
In case of memory debugging, the definitions are a bit more
|
In case of memory debugging, the definitions are a bit more
|
||||||
complex, because we want to provide more information, *and* we want
|
complex, because we want to provide more information, *and* we want
|
||||||
@ -93,9 +93,9 @@ memfatal (const char *context, long attempted_size)
|
|||||||
|
|
||||||
#define xmalloc(a) xmalloc_debug (a, __FILE__, __LINE__)
|
#define xmalloc(a) xmalloc_debug (a, __FILE__, __LINE__)
|
||||||
#define xmalloc0(a) xmalloc0_debug (a, __FILE__, __LINE__)
|
#define xmalloc0(a) xmalloc0_debug (a, __FILE__, __LINE__)
|
||||||
#define xfree(a) xfree_debug (a, __FILE__, __LINE__)
|
|
||||||
#define xrealloc(a, b) xrealloc_debug (a, b, __FILE__, __LINE__)
|
#define xrealloc(a, b) xrealloc_debug (a, b, __FILE__, __LINE__)
|
||||||
#define xstrdup(a) xstrdup_debug (a, __FILE__, __LINE__)
|
#define xstrdup(a) xstrdup_debug (a, __FILE__, __LINE__)
|
||||||
|
#define xfree(a) xfree_debug (a, __FILE__, __LINE__)
|
||||||
|
|
||||||
Each of the *_debug function does its magic and calls the real one. */
|
Each of the *_debug function does its magic and calls the real one. */
|
||||||
|
|
||||||
@ -163,6 +163,30 @@ xstrdup_real (const char *s)
|
|||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC_IF_DEBUG void
|
||||||
|
xfree_real (void *ptr)
|
||||||
|
{
|
||||||
|
/* Wget's xfree() must not be passed a NULL pointer. This is for
|
||||||
|
historical reasons: many pre-C89 systems were known to bomb at
|
||||||
|
free(NULL), and Wget was careful to use xfree_null when there is
|
||||||
|
a possibility of PTR being NULL. (It might have been better to
|
||||||
|
simply have xfree() do nothing if ptr==NULL.)
|
||||||
|
|
||||||
|
Since the code is already written that way, this assert simply
|
||||||
|
enforces that constraint. Code that thinks it doesn't deal with
|
||||||
|
NULL, and it in fact does, aborts immediately. If you trip on
|
||||||
|
this, either the code has a pointer handling bug or should have
|
||||||
|
called xfree_null instead of xfree. Correctly written code
|
||||||
|
should never trigger this assertion.
|
||||||
|
|
||||||
|
If the assertion proves to be too much of a hassle, it can be
|
||||||
|
removed and a check that makes NULL a no-op placed in its stead.
|
||||||
|
If that is done, xfree_null is no longer needed and should be
|
||||||
|
removed. */
|
||||||
|
assert (ptr != NULL);
|
||||||
|
free (ptr);
|
||||||
|
}
|
||||||
|
|
||||||
/* xfree_real is unnecessary because free doesn't require any special
|
/* xfree_real is unnecessary because free doesn't require any special
|
||||||
functionality. */
|
functionality. */
|
||||||
|
|
||||||
@ -300,10 +324,18 @@ xstrdup_debug (const char *s, const char *source_file, int source_line)
|
|||||||
void
|
void
|
||||||
xfree_debug (void *ptr, const char *source_file, int source_line)
|
xfree_debug (void *ptr, const char *source_file, int source_line)
|
||||||
{
|
{
|
||||||
assert (ptr != NULL);
|
/* See xfree_real for rationale of this abort. We repeat it here
|
||||||
|
because we can print the file and the line where the offending
|
||||||
|
free occurred. */
|
||||||
|
if (ptr == NULL)
|
||||||
|
{
|
||||||
|
fprintf ("%s: xfree(NULL) at %s:%d\n",
|
||||||
|
exec_name, source_file, source_line);
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
++free_count;
|
++free_count;
|
||||||
unregister_ptr (ptr);
|
unregister_ptr (ptr);
|
||||||
free (ptr);
|
xfree_real (ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* DEBUG_MALLOC */
|
#endif /* DEBUG_MALLOC */
|
||||||
|
@ -30,10 +30,18 @@ so, delete this exception statement from your version. */
|
|||||||
#ifndef XMALLOC_H
|
#ifndef XMALLOC_H
|
||||||
#define XMALLOC_H
|
#define XMALLOC_H
|
||||||
|
|
||||||
|
/* Define this if you want primitive but extensive malloc debugging.
|
||||||
|
It will make Wget extremely slow, so only do it in development
|
||||||
|
builds. */
|
||||||
|
#define DEBUG_MALLOC
|
||||||
|
|
||||||
/* When DEBUG_MALLOC is not defined (which is normally the case), the
|
/* When DEBUG_MALLOC is not defined (which is normally the case), the
|
||||||
allocation functions directly map to *_real wrappers. In the
|
allocation functions directly map to *_real wrappers. In the
|
||||||
DEBUG_MALLOC mode, they also record the file and line where the
|
DEBUG_MALLOC mode, they also record the file and line where the
|
||||||
offending malloc/free/... was invoked. */
|
offending malloc/free/... was invoked.
|
||||||
|
|
||||||
|
*Note*: xfree(NULL) aborts. If the pointer you're freeing can be
|
||||||
|
NULL, use xfree_null instead. */
|
||||||
|
|
||||||
#ifndef DEBUG_MALLOC
|
#ifndef DEBUG_MALLOC
|
||||||
|
|
||||||
@ -41,26 +49,27 @@ so, delete this exception statement from your version. */
|
|||||||
#define xmalloc0 xmalloc0_real
|
#define xmalloc0 xmalloc0_real
|
||||||
#define xrealloc xrealloc_real
|
#define xrealloc xrealloc_real
|
||||||
#define xstrdup xstrdup_real
|
#define xstrdup xstrdup_real
|
||||||
#define xfree free
|
#define xfree xfree_real
|
||||||
|
|
||||||
void *xmalloc_real PARAMS ((size_t));
|
void *xmalloc_real PARAMS ((size_t));
|
||||||
void *xmalloc0_real PARAMS ((size_t));
|
void *xmalloc0_real PARAMS ((size_t));
|
||||||
void *xrealloc_real PARAMS ((void *, size_t));
|
void *xrealloc_real PARAMS ((void *, size_t));
|
||||||
char *xstrdup_real PARAMS ((const char *));
|
char *xstrdup_real PARAMS ((const char *));
|
||||||
|
void xfree_real PARAMS ((void *));
|
||||||
|
|
||||||
#else /* DEBUG_MALLOC */
|
#else /* DEBUG_MALLOC */
|
||||||
|
|
||||||
#define xmalloc(s) xmalloc_debug (s, __FILE__, __LINE__)
|
#define xmalloc(s) xmalloc_debug (s, __FILE__, __LINE__)
|
||||||
#define xmalloc0(s) xmalloc0_debug (s, __FILE__, __LINE__)
|
#define xmalloc0(s) xmalloc0_debug (s, __FILE__, __LINE__)
|
||||||
#define xfree(p) xfree_debug (p, __FILE__, __LINE__)
|
|
||||||
#define xrealloc(p, s) xrealloc_debug (p, s, __FILE__, __LINE__)
|
#define xrealloc(p, s) xrealloc_debug (p, s, __FILE__, __LINE__)
|
||||||
#define xstrdup(p) xstrdup_debug (p, __FILE__, __LINE__)
|
#define xstrdup(p) xstrdup_debug (p, __FILE__, __LINE__)
|
||||||
|
#define xfree(p) xfree_debug (p, __FILE__, __LINE__)
|
||||||
|
|
||||||
void *xmalloc_debug PARAMS ((size_t, const char *, int));
|
void *xmalloc_debug PARAMS ((size_t, const char *, int));
|
||||||
void *xmalloc0_debug PARAMS ((size_t, const char *, int));
|
void *xmalloc0_debug PARAMS ((size_t, const char *, int));
|
||||||
void xfree_debug PARAMS ((void *, const char *, int));
|
|
||||||
void *xrealloc_debug PARAMS ((void *, size_t, const char *, int));
|
void *xrealloc_debug PARAMS ((void *, size_t, const char *, int));
|
||||||
char *xstrdup_debug PARAMS ((const char *, const char *, int));
|
char *xstrdup_debug PARAMS ((const char *, const char *, int));
|
||||||
|
void xfree_debug PARAMS ((void *, const char *, int));
|
||||||
|
|
||||||
#endif /* DEBUG_MALLOC */
|
#endif /* DEBUG_MALLOC */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user