Add checks to check_sec.sh for memory functions.
These include a check for use of safe_free() instead of FREE() and a
check whether FREE(&...) is used.
For the former, __SAFE_FREE_CHECKED__ is to be used, for the latter
__FREE_CHECKED__ to avoid messages from check_sec.sh
{
FREE (&((*tmp)->path));
tmp1=(*tmp)->next;
- FREE (tmp);
+ FREE (tmp); /* __FREE_CHECKED__ */
*tmp=tmp1;
}
return 0;
{
FREE (&((*tmp)->path));
tmp1=(*tmp)->next;
- FREE (tmp);
+ FREE (tmp); /* __FREE_CHECKED__ */
*tmp=tmp1;
}
continue;
*ob = '\0';
- FREE (ps);
+ FREE (ps); /* __FREE_CHECKED__ */
*ps = buf;
mutt_str_adjust (ps);
if (fc->cd != (iconv_t)-1)
iconv_close (fc->cd);
- FREE (_fc);
+ FREE (_fc); /* __FREE_CHECKED__ */
}
do_check '\<strcat' __STRCAT_CHECKED__ "Alert: Unchecked strcat calls."
do_check '\<sprintf.*%s' __SPRINTF_CHECKED__ "Alert: Unchecked sprintf calls."
do_check '\<strncat' __STRNCAT_CHECKED__ "You probably meant safe_strcat here."
+do_check '\<safe_free' __SAFE_FREE_CHECKED__ "You probably meant FREE here."
+do_check '\<FREE[ ]?\([^&]' __FREE_CHECKED__ "You probably meant FREE(&...) here."
# don't do this check on others' code.
do_check_files '\<(malloc|realloc|free|strdup)[ ]*\(' __MEM_CHECKED__ "Alert: Use of traditional memory management calls." \
regfree(&tmp->rx);
mutt_pattern_free(&tmp->color_pattern);
FREE (&tmp->pattern);
- FREE (l);
+ FREE (l); /* __FREE_CHECKED__ */
}
void ci_start_color (void)
if (!esp) return;
FREE (&(*esp)->wbuf);
- FREE (esp);
+ FREE (esp); /* __FREE_CHECKED__ */
}
/*
for (; *ctx; *ctx = p)
{
p = (*ctx)->next;
- FREE (ctx);
+ FREE (ctx); /* __FREE_CHECKED__ */
}
}
}
}
FREE (&pptr->table);
- FREE (ptr);
+ FREE (ptr); /* __FREE_CHECKED__ */
}
/* this should be safe even if the list wasn't used */
mutt_free_list (&(((IMAP_HEADER_DATA*) *data)->keywords));
- FREE (data);
+ FREE (data); /* __FREE_CHECKED__ */
}
/* imap_set_flags: fill out the message header according to the flags from
if (!mutt_convert_string (&t, Charset, "UTF-8", 0))
{
char *u7 = utf8_to_utf7 (t, strlen (t), NULL, 0);
- FREE (s);
+ FREE (s); /* __FREE_CHECKED__ */
*s = u7;
}
FREE (&t);
char *t = utf7_to_utf8 (*s, strlen (*s), 0, 0);
if (t && !mutt_convert_string (&t, "UTF-8", Charset, 0))
{
- FREE (s);
+ FREE (s); /* __FREE_CHECKED__ */
*s = t;
}
}
imap_mboxcache_free (*idata);
mutt_buffer_free(&(*idata)->cmdbuf);
FREE (&(*idata)->buf);
- FREE (idata);
+ FREE (idata); /* __FREE_CHECKED__ */
}
/*
break;
case DT_PATH:
case DT_STR:
- FREE ((char**)p->data);
+ FREE ((char**)p->data); /* __FREE_CHECKED__ */
break;
}
}
* the template, and leaving t pointed at the current item.
*/
t = last;
- safe_free(&t->template);
+ FREE(&t->template);
break;
}
if (!last->next)
{
*list = spam->next;
mutt_free_regexp(&spam->rx);
- safe_free(&spam->template);
- safe_free(&spam);
+ FREE(&spam->template);
+ FREE(&spam);
return 1;
}
{
prev->next = spam->next;
mutt_free_regexp(&spam->rx);
- safe_free(&spam->template);
- safe_free(&spam);
+ FREE(&spam->template);
+ FREE(&spam);
spam = prev->next;
++nremoved;
}
a->major_int = mutt_check_mime_type(a->major);
regcomp(&a->minor_rx, tmpminor, REG_ICASE|REG_EXTENDED);
- safe_free(&tmpminor);
+ FREE(&tmpminor);
dprint(5, (debugfile, "parse_attach_list: added %s/%s [%d]\n",
a->major, a->minor, a->major_int));
else if (DTYPE (MuttVars[idx].type) == DT_ADDR)
rfc822_free_address ((ADDRESS **) MuttVars[idx].data);
else
- FREE ((void *) MuttVars[idx].data);
+ /* MuttVars[idx].data is already 'char**' (or some 'void**') or...
+ * so cast to 'void*' is okay */
+ FREE ((void *) MuttVars[idx].data); /* __FREE_CHECKED__ */
}
else if (query || *s->dptr != '=')
{
else if (DTYPE (MuttVars[idx].type) == DT_ADDR)
rfc822_free_address ((ADDRESS **) MuttVars[idx].data);
else
- FREE ((void *) MuttVars[idx].data);
+ /* MuttVars[idx].data is already 'char**' (or some 'void**') or...
+ * so cast to 'void*' is okay */
+ FREE ((void *) MuttVars[idx].data); /* __FREE_CHECKED__ */
mutt_extract_token (tmp, s, 0);
if (myvar)
tmp = (*cur)->next;
FREE (&(*cur)->name);
FREE (&(*cur)->value);
- FREE (cur);
+ FREE (cur); /* __FREE_CHECKED__ */
*cur = tmp;
}
}
*p = r;
}
-void safe_free (void *ptr)
+void safe_free (void *ptr) /* __SAFE_FREE_CHECKED__ */
{
void **p = (void **)ptr;
if (*p)
void mutt_str_replace (char **p, const char *s)
{
- FREE (p);
+ FREE (p); /* __FREE_CHECKED__ */
*p = safe_strdup (s);
}
FREE (& (*p)->dialog);
}
- FREE (p);
+ FREE (p); /* __FREE_CHECKED__ */
}
#define M_SEARCH_UP 1
if ((*fp = fdopen (fd, "w")) == NULL)
{
- FREE (tgt);
+ FREE (tgt); /* __FREE_CHECKED__ */
close (fd);
unlink (path);
return (-1);
if ((*md)->h)
mutt_free_header (&(*md)->h);
- FREE (md);
+ FREE (md); /* __FREE_CHECKED__ */
}
static void maildir_free_maildir (struct maildir **md)
return 0;
notrans:
- FREE (out);
+ FREE (out); /* __FREE_CHECKED__ */
*out = safe_strdup (in);
return 1;
}
FREE (&tmp);
if (rv < 0)
{
- FREE (out);
+ FREE (out); /* __FREE_CHECKED__ */
*out = safe_strdup (in);
}
return rv;
gnutls_certificate_free_credentials (data->xcred);
gnutls_deinit (data->state);
- safe_free ((void **) &conn->sockdata);
+ FREE (&conn->sockdata);
}
return raw_socket_close (conn);
#if defined USE_POP || defined USE_IMAP
FREE (&(*h)->data);
#endif
- FREE (h);
+ FREE (h); /* __FREE_CHECKED__ */
}
/* returns true if the header contained in "s" is in list "t" */
mutt_free_list (&(*p)->references);
mutt_free_list (&(*p)->in_reply_to);
mutt_free_list (&(*p)->userhdrs);
- FREE (p);
+ FREE (p); /* __FREE_CHECKED__ */
}
/* move all the headers from extra not present in base into base */
mutt_str_replace (directory, fname);
break;
case 1: /* yes */
- FREE (directory);
+ FREE (directory); /* __FREE_CHECKED__ */
break;
case -1: /* abort */
- FREE (directory);
+ FREE (directory); /* __FREE_CHECKED__ */
return -1;
case 2: /* no */
- FREE (directory);
+ FREE (directory); /* __FREE_CHECKED__ */
return 1;
}
}
}
else
{
- safe_free(&b->data);
+ FREE(&b->data);
}
memset(b, 0, sizeof(BUFFER));
return b;
FREE(&(*p)->data);
/* dptr is just an offset to data and shouldn't be freed */
- FREE(p);
+ FREE(p); /* __FREE_CHECKED__ */
}
/* dynamically grows a BUFFER to accomodate s, in increments of 128 bytes.
FREE (&(*pp)->pattern);
regfree ((*pp)->rx);
FREE (&(*pp)->rx);
- FREE (pp);
+ FREE (pp); /* __FREE_CHECKED__ */
}
void mutt_free_rx_list (RX_LIST **list)
p = *list;
*list = (*list)->next;
mutt_free_regexp (&p->rx);
- safe_free(&p->template);
+ FREE (&p->template);
FREE (&p);
}
}
FREE (&(*msg)->path);
}
- FREE (msg);
+ FREE (msg); /* __FREE_CHECKED__ */
return (r);
}
ptr = (*QuoteList)->next;
if ((*QuoteList)->prefix)
FREE (&(*QuoteList)->prefix);
- FREE (QuoteList);
+ FREE (QuoteList); /* __FREE_CHECKED__ */
*QuoteList = ptr;
}
pgp_free_uid (&kp->address);
FREE (&kp->keyid);
- FREE (kpp);
+ /* mutt_crypt.h: 'typedef struct pgp_keyinfo *pgp_key_t;' */
+ FREE (kpp); /* __FREE_CHECKED__ */
}
pgp_key_t pgp_remove_key (pgp_key_t *klist, pgp_key_t key)
FREE (&(*r)->addr);
FREE (&(*r)->ver);
- FREE (r);
+ FREE (r); /* __FREE_CHECKED__ */
}
/* parse the type2.list as given by mixmaster -T */
for (i = 0; type2_list[i]; i++)
mix_free_remailer (&type2_list[i]);
- FREE (type2_list);
+ FREE (type2_list); /* __FREE_CHECKED__ */
}
FREE (&p->editcommand);
FREE (&p->printcommand);
FREE (&p->nametemplate);
- FREE (entry);
+ FREE (entry); /* __FREE_CHECKED__ */
}
/*
Charset, charsets, &e, &elen,
encode_specials ? RFC822Specials : NULL);
- FREE (pd);
+ FREE (pd); /* __FREE_CHECKED__ */
*pd = e;
}
}
*d = 0;
- FREE (pd);
+ FREE (pd); /* __FREE_CHECKED__ */
*pd = d0;
mutt_str_adjust (pd);
}
{
FREE (&(*p)->attribute);
FREE (&(*p)->value);
- FREE (p);
+ FREE (p); /* __FREE_CHECKED__ */
}
}
if (d != *pd)
FREE (&d);
- FREE (pd);
+ FREE (pd); /* __FREE_CHECKED__ */
*pd = e;
}
else if (d != *pd)
{
- FREE (pd);
+ FREE (pd); /* __FREE_CHECKED__ */
*pd = d;
}
}
#ifdef TESTING
-int safe_free (void **p)
+int safe_free (void **p) /* __SAFE_FREE_CHECKED__ */
{
free(*p); /* __MEM_CHECKED__ */
*p = 0;
for (i = 0; i < ncodes; i++)
FREE (&tcode[i]);
- FREE (tcode);
+ FREE (tcode); /* __FREE_CHECKED__ */
return ret;
}
else if (pid == -1)
{
unlink (msg);
- FREE (tempfile);
+ FREE (tempfile); /* __FREE_CHECKED__ */
_exit (S_ERR);
}
if (SendmailWait && st == (0xff & EX_OK))
{
unlink (*tempfile); /* no longer needed */
- FREE (tempfile);
+ FREE (tempfile); /* __FREE_CHECKED__ */
}
}
else
if (SendmailWait > 0)
{
unlink (*tempfile);
- FREE (tempfile);
+ FREE (tempfile); /* __FREE_CHECKED__ */
}
}
{
/* the parent is already dead */
unlink (*tempfile);
- FREE (tempfile);
+ FREE (tempfile); /* __FREE_CHECKED__ */
}
_exit (st);