use of strncat in part of the mutt code base.
else
{
getcwd (LastDir, sizeof (LastDir));
- strcat (LastDir, "/"); /* __STRCAT_CHECKED__ */
- strncat (LastDir, f, i);
+ safe_strcat (LastDir, sizeof (LastDir), "/");
+ safe_strncat (LastDir, sizeof (LastDir), f, i);
}
}
else
pos = 0;
first = 1;
buffylist[0] = 0;
- pos += strlen (strncat (buffylist, _("New mail in "), sizeof (buffylist) - 1 - pos));
+ pos += strlen (strncat (buffylist, _("New mail in "), sizeof (buffylist) - 1 - pos)); /* __STRNCAT_CHECKED__ */
for (tmp = Incoming; tmp; tmp = tmp->next)
{
/* Is there new mail in this mailbox? */
break;
if (!first)
- pos += strlen (strncat(buffylist + pos, ", ", sizeof(buffylist)-1-pos));
+ pos += strlen (strncat(buffylist + pos, ", ", sizeof(buffylist)-1-pos)); /* __STRNCAT_CHECKED__ */
/* Prepend an asterisk to mailboxes not already notified */
if (!tmp->notified)
{
- /* pos += strlen (strncat(buffylist + pos, "*", sizeof(buffylist)-1-pos)); */
+ /* pos += strlen (strncat(buffylist + pos, "*", sizeof(buffylist)-1-pos)); __STRNCAT_CHECKED__ */
tmp->notified = 1;
BuffyNotify--;
}
- pos += strlen (strncat(buffylist + pos, path, sizeof(buffylist)-1-pos));
+ pos += strlen (strncat(buffylist + pos, path, sizeof(buffylist)-1-pos)); /* __STRNCAT_CHECKED__ */
first = 0;
}
if (!first && tmp)
{
- strncat (buffylist + pos, ", ...", sizeof (buffylist) - 1 - pos);
+ strncat (buffylist + pos, ", ...", sizeof (buffylist) - 1 - pos); /* __STRNCAT_CHECKED__ */
}
if (!first)
{
do_check '\<(mutt_)?strcpy' __STRCPY_CHECKED__ "Alert: Unchecked strcpy calls."
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."
# don't do this check on others' code.
do_check_files '\<(malloc|realloc|free|strdup)[ ]*\(' __MEM_CHECKED__ "Alert: Use of traditional memory management calls." \
mutt_format_string (prompt, sizeof (prompt),
0, COLS-extra_space, 0, 0,
prompt, sizeof (prompt), 0);
- strncat (prompt, "...?", sizeof (prompt));
+ safe_strcat (prompt, sizeof (prompt), "...?");
}
else
- strncat (prompt, "?", sizeof (prompt));
+ safe_strcat (prompt, sizeof (prompt), "?");
if (query_quadoption (OPT_BOUNCE, prompt) != M_YES)
{
done = 1;
else
{
- strncat (tmp, "\n", sizeof(tmp)); tmp[sizeof(tmp) - 1] = '\0';
+ safe_strcat (tmp, sizeof (tmp), "\n");
if (buflen == bufmax)
safe_realloc (&buf, sizeof (char *) * (bufmax += 25));
buf[buflen++] = safe_strdup (tmp[1] == '~' ? tmp + 1 : tmp);
mutt_to_base64 ((unsigned char*) ibuf, (unsigned char*) obuf, strlen (obuf),
sizeof (ibuf) - 2);
- strncat (ibuf, "\r\n", sizeof (ibuf));
+ safe_strcat (ibuf, sizeof (ibuf), "\r\n");
mutt_socket_write (idata->conn, ibuf);
do
mutt_to_base64 ((unsigned char*) buf1, send_token.value, send_token.length,
sizeof (buf1) - 2);
gss_release_buffer (&min_stat, &send_token);
- strncat (buf1, "\r\n", sizeof (buf1));
+ safe_strcat (buf1, sizeof (buf1), "\r\n");
mutt_socket_write (idata->conn, buf1);
while (maj_stat == GSS_S_CONTINUE_NEEDED)
mutt_to_base64 ((unsigned char*) buf1, send_token.value,
send_token.length, sizeof (buf1) - 2);
gss_release_buffer (&min_stat, &send_token);
- strncat (buf1, "\r\n", sizeof (buf1));
+ safe_strcat (buf1, sizeof (buf1), "\r\n");
mutt_socket_write (idata->conn, buf1);
}
sizeof (buf1) - 2);
dprint (2, (debugfile, "Requesting authorisation as %s\n",
idata->conn->account.user));
- strncat (buf1, "\r\n", sizeof (buf1));
+ safe_strcat (buf1, sizeof (buf1), "\r\n");
mutt_socket_write (idata->conn, buf1);
/* Joy of victory or agony of defeat? */
{
if (mutt_bit_isset (idata->rights, aclbit))
if (flag)
- strncat (flags, str, flsize);
+ safe_strcat (flags, flsize, str);
}
/* imap_make_msg_set: make an IMAP4rev1 UID message set out of a set of
{
if (msg_has_flag (mailbox_flags, keywords->data))
{
- strncat (s, keywords->data, slen);
- strncat (s, " ", slen);
+ safe_strcat (s, slen, keywords->data);
+ safe_strcat (s, slen, " ");
}
keywords = keywords->next;
}
return (p);
}
+char *safe_strcat (char *d, size_t l, const char *s)
+{
+ char *p = d;
+
+ if (!l)
+ return d;
+
+ l--; /* Space for the trailing '\0'. */
+
+ for (; *d && l; l--)
+ d++;
+ for (; *s && l; l--)
+ *d++ = *s++;
+
+ *d = '\0';
+
+ return p;
+}
+
+char *safe_strncat (char *d, size_t l, const char *s, size_t sl)
+{
+ char *p = d;
+
+ if (!l)
+ return d;
+
+ l--; /* Space for the trailing '\0'. */
+
+ for (; *d && l; l--)
+ d++;
+ for (; *s && l && sl; l--, sl--)
+ *d++ = *s++;
+
+ *d = '\0';
+
+ return p;
+}
+
+
void mutt_str_replace (char **p, const char *s)
{
FREE (p);
char *mutt_strlower (char *);
char *mutt_substrcpy (char *, const char *, const char *, size_t);
char *mutt_substrdup (const char *, const char *);
+char *safe_strcat (char *, size_t, const char *);
+char *safe_strncat (char *, size_t, const char *, size_t);
char *safe_strdup (const char *);
const char *mutt_stristr (const char *, const char *);
{
char ch[8];
snprintf (ch, 8, "%02X%s", md[j], (j % 2 ? " " : ""));
- strncat (s, ch, l);
+ safe_strcat (s, l, ch);
}
}
}
helpstr[0] = '\0';
mutt_make_help (buf, sizeof (buf), _("Exit "), MENU_GENERIC, OP_EXIT);
- strncat (helpstr, buf, sizeof (helpstr));
+ safe_strcat (helpstr, sizeof (helpstr), buf);
mutt_make_help (buf, sizeof (buf), _("Help"), MENU_GENERIC, OP_HELP);
- strncat (helpstr, buf, sizeof (helpstr));
+ safe_strcat (helpstr, sizeof (helpstr), buf);
menu->help = helpstr;
done = 0;
if (!found && destlen > 0)
{
- strncat (dest, " ", destlen);
- strncat (dest, src, destlen-1);
+ safe_strcat (dest, destlen, " ");
+ safe_strcat (dest, destlen, src);
}
}
*/
BUFFER * mutt_buffer_from(BUFFER *b, char *seed)
{
- int n;
-
if (!seed)
return NULL;
/* If this pattern needs more matches, expand pmatch. */
if (l->nmatch > nmatch)
{
- safe_realloc ((void**) &pmatch, l->nmatch * sizeof(regmatch_t));
+ safe_realloc (&pmatch, l->nmatch * sizeof(regmatch_t));
nmatch = l->nmatch;
}
mutt_format_string (prompt, sizeof (prompt) - 4,
0, COLS-extra_space, 0, 0,
prompt, sizeof (prompt), 0);
- strncat (prompt, "...?", sizeof (prompt));
+ safe_strcat (prompt, sizeof (prompt), "...?");
}
else
- strncat (prompt, "?", sizeof (prompt));
+ safe_strcat (prompt, sizeof (prompt), "?");
if (query_quadoption (OPT_BOUNCE, prompt) != M_YES)
{
}
/* url_ciss_tostring: output the URL string for a given CISS object. */
+
int url_ciss_tostring (ciss_url_t* ciss, char* dest, size_t len, int flags)
{
+ long l;
+
if (ciss->scheme == U_UNKNOWN)
return -1;
if (ciss->host)
{
- strncat (dest, "//", len - strlen (dest));
+ safe_strcat (dest, len, "//");
+ len -= (l = strlen (dest)); dest += l;
+
if (ciss->user) {
if (flags & U_DECODE_PASSWD && ciss->pass)
- snprintf (dest + strlen (dest), len - strlen (dest), "%s:%s@",
- ciss->user, ciss->pass);
+ snprintf (dest, len, "%s:%s@", ciss->user, ciss->pass);
else
- snprintf (dest + strlen (dest), len - strlen (dest), "%s@",
- ciss->user);
+ snprintf (dest, len, "%s@", ciss->user);
+
+ len -= (l = strlen (dest)); dest += l;
}
if (ciss->port)
- snprintf (dest + strlen (dest), len - strlen (dest), "%s:%hu/",
- ciss->host, ciss->port);
+ snprintf (dest, len, "%s:%hu/", ciss->host, ciss->port);
else
- snprintf (dest + strlen (dest), len - strlen (dest), "%s/", ciss->host);
+ snprintf (dest, len, "%s/", ciss->host);
}
if (ciss->path)
- strncat (dest, ciss->path, len - strlen (dest));
+ safe_strcat (dest, len, ciss->path);
return 0;
}