Use glib for all allocations

- Removes need to check for malloc failure
- Removes need for NULL checks on free
- Adds checks for integer overflows
- Removes some extra memset calls
- Removes chance of mixing libc and glib malloc/free
This commit is contained in:
TingPing
2014-12-28 06:37:25 -05:00
parent c4cb1b25ec
commit 83032b1aa3
46 changed files with 796 additions and 1082 deletions

View File

@ -90,7 +90,7 @@ random_line (char *file_name)
{
nofile:
/* reason is not a file, an actual reason! */
return strdup (file_name);
return g_strdup (file_name);
}
/* count number of lines in file */
@ -111,7 +111,7 @@ random_line (char *file_name)
}
while (lines > ran);
fclose (fh);
return strdup (buf);
return g_strdup (buf);
}
void
@ -121,7 +121,7 @@ server_sendpart (server * serv, char *channel, char *reason)
{
reason = random_line (prefs.hex_irc_part_reason);
serv->p_part (serv, channel, reason);
free (reason);
g_free (reason);
} else
{
/* reason set by /quit, /close argument */
@ -136,12 +136,12 @@ server_sendquit (session * sess)
if (!sess->quitreason)
{
colrea = strdup (prefs.hex_irc_quit_reason);
colrea = g_strdup (prefs.hex_irc_quit_reason);
check_special_chars (colrea, FALSE);
rea = random_line (colrea);
free (colrea);
g_free (colrea);
sess->server->p_quit (sess->server, rea);
free (rea);
g_free (rea);
} else
{
/* reason set by /quit, /close argument */
@ -269,7 +269,7 @@ cmd_addserver (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (!network)
{
network = servlist_net_add (word[2], "", TRUE);
network->encoding = strdup (IRC_DEFAULT_CHARSET);
network->encoding = g_strdup (IRC_DEFAULT_CHARSET);
}
/* if we had the network already, check if the given server already exists */
else if (servlist_server_find (network, word_eol[3], NULL))
@ -379,11 +379,10 @@ cmd_away (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (sess->server->last_away_reason != reason)
{
if (sess->server->last_away_reason)
free (sess->server->last_away_reason);
g_free (sess->server->last_away_reason);
if (reason == word_eol[2])
sess->server->last_away_reason = strdup (reason);
sess->server->last_away_reason = g_strdup (reason);
else
sess->server->last_away_reason = reason;
}
@ -406,8 +405,7 @@ cmd_back (struct session *sess, char *tbuf, char *word[], char *word_eol[])
PrintText (sess, _("Already marked back.\n"));
}
if (sess->server->last_away_reason)
free (sess->server->last_away_reason);
g_free (sess->server->last_away_reason);
sess->server->last_away_reason = NULL;
return TRUE;
@ -1002,14 +1000,14 @@ mdehop_cb (struct User *user, multidata *data)
static int
cmd_mdehop (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
char **nicks = malloc (sizeof (char *) * sess->hops);
char **nicks = g_new0 (char *, sess->hops);
multidata data;
data.nicks = nicks;
data.i = 0;
tree_foreach (sess->usertree, (tree_traverse_func *)mdehop_cb, &data);
send_channel_modes (sess, tbuf, nicks, 0, data.i, '-', 'h', 0);
free (nicks);
g_free (nicks);
return TRUE;
}
@ -1028,14 +1026,14 @@ mdeop_cb (struct User *user, multidata *data)
static int
cmd_mdeop (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
char **nicks = malloc (sizeof (char *) * sess->ops);
char **nicks = g_new0(char *, sess->ops);
multidata data;
data.nicks = nicks;
data.i = 0;
tree_foreach (sess->usertree, (tree_traverse_func *)mdeop_cb, &data);
send_channel_modes (sess, tbuf, nicks, 0, data.i, '-', 'o', 0);
free (nicks);
g_free (nicks);
return TRUE;
}
@ -1045,18 +1043,13 @@ GSList *menu_list = NULL;
static void
menu_free (menu_entry *me)
{
free (me->path);
if (me->label)
free (me->label);
if (me->cmd)
free (me->cmd);
if (me->ucmd)
free (me->ucmd);
if (me->group)
free (me->group);
if (me->icon)
free (me->icon);
free (me);
g_free (me->path);
g_free (me->label);
g_free (me->cmd);
g_free (me->ucmd);
g_free (me->group);
g_free (me->icon);
g_free (me);
}
/* strings equal? but ignore underscores */
@ -1195,7 +1188,7 @@ menu_add (char *path, char *label, char *cmd, char *ucmd, int pos, int state, in
return;
}
me = malloc (sizeof (menu_entry));
me = g_new (menu_entry, 1);
me->pos = pos;
me->modifier = mod;
me->is_main = menu_is_mainmenu_root (path, &me->root_offset);
@ -1203,31 +1196,26 @@ menu_add (char *path, char *label, char *cmd, char *ucmd, int pos, int state, in
me->markup = markup;
me->enable = enable;
me->key = key;
me->path = strdup (path);
me->path = g_strdup (path);
me->label = NULL;
me->cmd = NULL;
me->ucmd = NULL;
me->group = NULL;
me->icon = NULL;
if (label)
me->label = strdup (label);
if (cmd)
me->cmd = strdup (cmd);
if (ucmd)
me->ucmd = strdup (ucmd);
if (group)
me->group = strdup (group);
if (icon)
me->icon = strdup (icon);
me->label = g_strdup (label);
me->cmd = g_strdup (cmd);
me->ucmd = g_strdup (ucmd);
me->group = g_strdup (group);
me->icon = g_strdup (icon);
menu_list = g_slist_append (menu_list, me);
label = fe_menu_add (me);
if (label)
{
/* FE has given us a stripped label */
free (me->label);
me->label = strdup (label);
g_free (me->label);
me->label = g_strdup (label);
g_free (label); /* this is from pango */
}
}
@ -1456,7 +1444,7 @@ exec_check_process (struct session *sess)
{
close (sess->running_exec->myfd);
fe_input_remove (sess->running_exec->iotag);
free (sess->running_exec);
g_free (sess->running_exec);
sess->running_exec = NULL;
}
}
@ -1533,11 +1521,10 @@ cmd_execw (struct session *sess, char *tbuf, char *word[], char *word_eol[])
return FALSE;
}
len = strlen(word_eol[2]);
temp = malloc(len + 2);
sprintf(temp, "%s\n", word_eol[2]);
temp = g_strconcat (word_eol[2], "\n", NULL);
PrintText(sess, temp);
write(sess->running_exec->myfd, temp, len + 1);
free(temp);
g_free(temp);
return TRUE;
}
@ -1561,7 +1548,7 @@ exec_handle_colors (char *buf, int len)
if (strchr (buf, 27) == 0)
return;
nbuf = malloc (len + 1);
nbuf = g_malloc (len + 1);
while (i < len)
{
@ -1655,7 +1642,7 @@ norm: nbuf[j] = buf[i];
nbuf[j] = 0;
memcpy (buf, nbuf, j + 1);
free (nbuf);
g_free (nbuf);
}
#ifndef HAVE_MEMRCHR
@ -1681,14 +1668,14 @@ exec_data (GIOChannel *source, GIOCondition condition, struct nbexec *s)
len = s->buffill;
if (len) {
/* append new data to buffered incomplete line */
buf = malloc(len + 2050);
buf = g_malloc (len + 2050);
memcpy(buf, s->linebuf, len);
readpos = buf + len;
free(s->linebuf);
g_free (s->linebuf);
s->linebuf = NULL;
}
else
readpos = buf = malloc(2050);
readpos = buf = g_malloc (2050);
rd = read (sok, readpos, 2048);
if (rd < 1)
@ -1709,12 +1696,12 @@ exec_data (GIOChannel *source, GIOCondition condition, struct nbexec *s)
else
PrintText (s->sess, buf);
}
free(buf);
g_free(buf);
waitpid (s->childpid, NULL, 0);
s->sess->running_exec = NULL;
fe_input_remove (s->iotag);
close (sok);
free (s);
g_free (s);
return TRUE;
}
len += rd;
@ -1727,7 +1714,7 @@ exec_data (GIOChannel *source, GIOCondition condition, struct nbexec *s)
rest = buf;
if (*rest) {
s->buffill = len - (rest - buf); /* = strlen(rest) */
s->linebuf = malloc(s->buffill + 1);
s->linebuf = g_malloc (s->buffill + 1);
memcpy(s->linebuf, rest, s->buffill);
*rest = '\0';
len -= s->buffill; /* possibly 0 */
@ -1743,7 +1730,7 @@ exec_data (GIOChannel *source, GIOCondition condition, struct nbexec *s)
PrintText (s->sess, buf);
}
free(buf);
g_free (buf);
return TRUE;
}
@ -1805,8 +1792,7 @@ cmd_exec (struct session *sess, char *tbuf, char *word[], char *word_eol[])
return FALSE;
}
#endif
s = (struct nbexec *) malloc (sizeof (struct nbexec));
memset(s, 0, sizeof(*s));
s = g_new0 (struct nbexec, 1);
s->myfd = fds[0];
s->tochannel = tochannel;
s->sess = sess;
@ -1853,8 +1839,9 @@ cmd_exec (struct session *sess, char *tbuf, char *word[], char *word_eol[])
PrintText (sess, "Error in fork(2)\n");
close(fds[0]);
close(fds[1]);
free (s);
} else
g_free (s);
}
else
{
/* Parent path */
close(fds[1]);
@ -1946,8 +1933,8 @@ get_bool_cb (int val, getvalinfo *info)
if (is_session (info->sess))
handle_command (info->sess, buf, FALSE);
free (info->cmd);
free (info);
g_free (info->cmd);
g_free (info);
}
static int
@ -1958,8 +1945,8 @@ cmd_getbool (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (!word[4][0])
return FALSE;
info = malloc (sizeof (*info));
info->cmd = strdup (word[2]);
info = g_new (getvalinfo, 1);
info->cmd = g_strdup (word[2]);
info->sess = sess;
fe_get_bool (word[3], word_eol[4], get_bool_cb, info);
@ -1979,8 +1966,8 @@ get_int_cb (int cancel, int val, getvalinfo *info)
handle_command (info->sess, buf, FALSE);
}
free (info->cmd);
free (info);
g_free (info->cmd);
g_free (info);
}
static int
@ -1991,8 +1978,8 @@ cmd_getint (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (!word[4][0])
return FALSE;
info = malloc (sizeof (*info));
info->cmd = strdup (word[3]);
info = g_new (getvalinfo, 1);
info->cmd = g_strdup (word[3]);
info->sess = sess;
fe_get_int (word[4], atoi (word[2]), get_int_cb, info);
@ -2015,7 +2002,7 @@ get_file_cb (char *cmd, char *file)
else
{
handle_command (current_sess, cmd, FALSE);
free (cmd);
g_free (cmd);
}
}
@ -2046,7 +2033,7 @@ cmd_getfile (struct session *sess, char *tbuf, char *word[], char *word_eol[])
idx++;
}
fe_get_file (word[idx+1], word[idx+2], (void *)get_file_cb, strdup (word[idx]), flags);
fe_get_file (word[idx+1], word[idx+2], (void *)get_file_cb, g_strdup (word[idx]), flags);
return TRUE;
}
@ -2063,8 +2050,8 @@ get_str_cb (int cancel, char *val, getvalinfo *info)
handle_command (info->sess, buf, FALSE);
}
free (info->cmd);
free (info);
g_free (info->cmd);
g_free (info);
}
static int
@ -2075,8 +2062,8 @@ cmd_getstr (struct session *sess, char *tbuf, char *word[], char *word_eol[])
if (!word[4][0])
return FALSE;
info = malloc (sizeof (*info));
info->cmd = strdup (word[3]);
info = g_new (getvalinfo, 1);
info->cmd = g_strdup (word[3]);
info->sess = sess;
fe_get_str (word[4], word[2], get_str_cb, info);
@ -2202,7 +2189,7 @@ cmd_help (struct session *sess, char *tbuf, char *word[], char *word_eol[])
} else
{
struct popup *pop;
char *buf = malloc (4096);
char *buf = g_malloc (4096);
help_list hl;
hl.longfmt = longfmt;
@ -2247,7 +2234,7 @@ cmd_help (struct session *sess, char *tbuf, char *word[], char *word_eol[])
plugin_command_foreach (sess, &hl, (void *)show_help_line);
strcat (buf, "\n");
PrintText (sess, buf);
free (buf);
g_free (buf);
PrintTextf (sess, "\n%s\n\n", _("Type /HELP <command> for more information, or /HELP -l"));
}
@ -2723,7 +2710,7 @@ mop_cb (struct User *user, multidata *data)
static int
cmd_mop (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
char **nicks = malloc (sizeof (char *) * (sess->total - sess->ops));
char **nicks = g_new0 (char *, sess->total - sess->ops);
multidata data;
data.nicks = nicks;
@ -2731,7 +2718,7 @@ cmd_mop (struct session *sess, char *tbuf, char *word[], char *word_eol[])
tree_foreach (sess->usertree, (tree_traverse_func *)mop_cb, &data);
send_channel_modes (sess, tbuf, nicks, 0, data.i, '+', 'o', 0);
free (nicks);
g_free (nicks);
return TRUE;
}
@ -4313,81 +4300,78 @@ check_special_chars (char *cmd, int do_ascii) /* check for %X */
if (!len)
return;
buf = malloc (len + 1);
buf = g_malloc (len + 1);
if (buf)
while (cmd[j])
{
while (cmd[j])
switch (cmd[j])
{
switch (cmd[j])
case '%':
occur++;
if ( do_ascii &&
j + 3 < len &&
(isdigit ((unsigned char) cmd[j + 1]) && isdigit ((unsigned char) cmd[j + 2]) &&
isdigit ((unsigned char) cmd[j + 3])))
{
case '%':
occur++;
if ( do_ascii &&
j + 3 < len &&
(isdigit ((unsigned char) cmd[j + 1]) && isdigit ((unsigned char) cmd[j + 2]) &&
isdigit ((unsigned char) cmd[j + 3])))
tbuf[0] = cmd[j + 1];
tbuf[1] = cmd[j + 2];
tbuf[2] = cmd[j + 3];
tbuf[3] = 0;
buf[i] = atoi (tbuf);
utf = g_locale_to_utf8 (buf + i, 1, 0, &utf_len, 0);
if (utf)
{
tbuf[0] = cmd[j + 1];
tbuf[1] = cmd[j + 2];
tbuf[2] = cmd[j + 3];
tbuf[3] = 0;
buf[i] = atoi (tbuf);
utf = g_locale_to_utf8 (buf + i, 1, 0, &utf_len, 0);
if (utf)
{
memcpy (buf + i, utf, utf_len);
g_free (utf);
i += (utf_len - 1);
}
j += 3;
} else
{
switch (cmd[j + 1])
{
case 'R':
buf[i] = '\026';
break;
case 'U':
buf[i] = '\037';
break;
case 'B':
buf[i] = '\002';
break;
case 'I':
buf[i] = '\035';
break;
case 'C':
buf[i] = '\003';
break;
case 'O':
buf[i] = '\017';
break;
case 'H': /* CL: invisible text code */
buf[i] = HIDDEN_CHAR;
break;
case '%':
buf[i] = '%';
break;
default:
buf[i] = '%';
j--;
break;
}
j++;
break;
default:
buf[i] = cmd[j];
memcpy (buf + i, utf, utf_len);
g_free (utf);
i += (utf_len - 1);
}
j += 3;
} else
{
switch (cmd[j + 1])
{
case 'R':
buf[i] = '\026';
break;
case 'U':
buf[i] = '\037';
break;
case 'B':
buf[i] = '\002';
break;
case 'I':
buf[i] = '\035';
break;
case 'C':
buf[i] = '\003';
break;
case 'O':
buf[i] = '\017';
break;
case 'H': /* CL: invisible text code */
buf[i] = HIDDEN_CHAR;
break;
case '%':
buf[i] = '%';
break;
default:
buf[i] = '%';
j--;
break;
}
j++;
break;
default:
buf[i] = cmd[j];
}
j++;
i++;
}
buf[i] = 0;
if (occur)
strcpy (cmd, buf);
free (buf);
j++;
i++;
}
buf[i] = 0;
if (occur)
strcpy (cmd, buf);
g_free (buf);
}
typedef struct
@ -4487,12 +4471,10 @@ handle_say (session *sess, char *text, int check_spch)
struct DCC *dcc;
char *word[PDIWORDS+1];
char *word_eol[PDIWORDS+1];
char pdibuf_static[1024];
char newcmd_static[1024];
char *pdibuf = pdibuf_static;
char *newcmd = newcmd_static;
char *pdibuf;
char *newcmd;
int len;
int newcmdlen = sizeof newcmd_static;
int newcmdlen;
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
if (strcmp (sess->channel, "(lastlog)") == 0)
@ -4502,11 +4484,9 @@ handle_say (session *sess, char *text, int check_spch)
}
len = strlen (text);
if (len >= sizeof pdibuf_static)
pdibuf = malloc (len + 1);
if (len + NICKLEN >= newcmdlen)
newcmd = malloc (newcmdlen = len + NICKLEN + 1);
pdibuf = g_malloc (len + 1);
newcmdlen = MAX(len + NICKLEN + 1, TBUFSIZE);
newcmd = g_malloc (newcmdlen);
if (check_spch && prefs.hex_input_perc_color)
check_special_chars (text, prefs.hex_input_perc_ascii);
@ -4579,11 +4559,9 @@ handle_say (session *sess, char *text, int check_spch)
}
xit:
if (pdibuf != pdibuf_static)
free (pdibuf);
g_free (pdibuf);
if (newcmd != newcmd_static)
free (newcmd);
g_free (newcmd);
}
char *
@ -4677,8 +4655,6 @@ handle_command (session *sess, char *cmd, int check_spch)
char *word_eol[PDIWORDS+1];
static int command_level = 0;
struct commands *int_cmd;
char pdibuf_static[1024];
char tbuf_static[TBUFSIZE];
char *pdibuf;
char *tbuf;
int len;
@ -4693,23 +4669,8 @@ handle_command (session *sess, char *cmd, int check_spch)
/* anything below MUST DEC command_level before returning */
len = strlen (cmd);
if (len >= sizeof (pdibuf_static))
{
pdibuf = malloc (len + 1);
}
else
{
pdibuf = pdibuf_static;
}
if ((len * 2) >= sizeof (tbuf_static))
{
tbuf = malloc ((len * 2) + 1);
}
else
{
tbuf = tbuf_static;
}
pdibuf = g_malloc (len + 1);
tbuf = g_malloc (MAX(TBUFSIZE, (len * 2) + 1));
/* split the text into words and word_eol */
process_data_init (pdibuf, cmd, word, word_eol, TRUE, TRUE);
@ -4802,15 +4763,8 @@ handle_command (session *sess, char *cmd, int check_spch)
xit:
command_level--;
if (pdibuf != pdibuf_static)
{
free (pdibuf);
}
if (tbuf != tbuf_static)
{
free (tbuf);
}
g_free (pdibuf);
g_free (tbuf);
return ret;
}