Bug 413874: tidy up string usage in mailnews, patch by Emre Birol <ebirol@gmail.com>, r=bienvenu, sr=dveditz

git-svn-id: svn://10.0.0.236/trunk@250322 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
gavin%gavinsharp.com
2008-04-16 20:06:21 +00:00
parent 9702c0eeb4
commit c66f2b6fa5
11 changed files with 130 additions and 88 deletions

View File

@@ -203,7 +203,7 @@ PRInt32 generate_encodedwords(char *pUTF8, const char *charset, char method, cha
char encodedword_head[kMAX_CSNAME+4+1];
nsCAutoString _charset;
char *pUTF8Head = nsnull, cUTF8Tmp = 0;
PRInt32 olen = 0, offset, linelen = output_carryoverlen, convlen = 0;
PRInt32 olen = 0, obufsize = outlen, offset, linelen = output_carryoverlen, convlen = 0;
PRInt32 encodedword_headlen = 0, encodedword_taillen = foldingonly ? 0 : 2; // "?="
nsresult rv;
@@ -324,18 +324,20 @@ PRInt32 generate_encodedwords(char *pUTF8, const char *charset, char method, cha
}
else {
/* no folding needed, let's fall thru */
strcpy(o, encodedword_head);
PL_strncpyz(o, encodedword_head, obufsize);
olen += encodedword_headlen;
linelen += encodedword_headlen;
obufsize -= encodedword_headlen;
o += encodedword_headlen;
if (!foldingonly)
*pUCS2 = 0;
}
}
else {
strcpy(o, "\r\n ");
PL_strncpyz(o, "\r\n ", obufsize);
olen += 3;
o += 3;
obufsize -= 3;
linelen = 1;
}
@@ -344,9 +346,10 @@ PRInt32 generate_encodedwords(char *pUTF8, const char *charset, char method, cha
*/
while ((foldingonly ? *pUTF8 : *pUCS2) && (olen < outlen)) {
strcpy(o, encodedword_head);
PL_strncpyz(o, encodedword_head, obufsize);
olen += encodedword_headlen;
linelen += encodedword_headlen;
obufsize -= encodedword_headlen;
o += encodedword_headlen;
olen += encodedword_taillen;
if (foldingonly)
@@ -393,8 +396,9 @@ PRInt32 generate_encodedwords(char *pUTF8, const char *charset, char method, cha
process_lastline:
PRInt32 enclen;
if (foldingonly) {
strcpy(o, pUTF8Head);
PL_strncpyz(o, pUTF8Head, obufsize);
enclen = strlen(o);
obufsize -= enclen;
o += enclen;
*pUTF8 = cUTF8Tmp;
}
@@ -405,12 +409,15 @@ process_lastline:
enclen = intlmime_encode_q((const unsigned char *)ibuf, strlen(ibuf), o);
PR_Free(ibuf);
o += enclen;
strcpy(o, "?=");
obufsize -= enclen;
PL_strncpyz(o, "?=", obufsize);
}
o += encodedword_taillen;
obufsize -= encodedword_taillen;
olen += enclen;
if (foldingonly ? *pUTF8 : *pUCS2) { /* not last line */
strcpy(o, "\r\n ");
PL_strncpyz(o, "\r\n ", obufsize);
obufsize -= 3;
o += 3;
olen += 3;
linelen = 1;
@@ -676,7 +683,7 @@ char * apply_rfc2047_encoding(const char *_src, PRBool structured, const char *c
break;
}
if (list->next) {
strcpy(outputtail, ", ");
PL_strncpyz(outputtail, ", ", outputlen);
cursor += 2;
outputtail += 2;
outputlen -= 2;
@@ -705,7 +712,7 @@ char * apply_rfc2047_encoding(const char *_src, PRBool structured, const char *c
if (cursor + skiplen + overhead < foldlen) {
char tmp = *(spacepos + 1);
*(spacepos + 1) = '\0';
strcpy(output, src);
PL_strncpyz(output, src, outputlen);
output += skiplen;
outputlen -= skiplen;
cursor += skiplen;

View File

@@ -1507,13 +1507,14 @@ mime_parse_stream_complete (nsMIMESession *stream)
bodyLen = strlen(body);
}
char* newbody = (char *)PR_MALLOC (bodyLen + 12); //+11 chars for <pre> & </pre> tags
PRUint32 newbodylen = bodyLen + 12; //+11 chars for <pre> & </pre> tags
char* newbody = (char *)PR_MALLOC (newbodylen);
if (newbody)
{
*newbody = 0;
PL_strcat(newbody, "<PRE>");
PL_strcat(newbody, body);
PL_strcat(newbody, "</PRE>");
PL_strcatn(newbody, newbodylen, "<PRE>");
PL_strcatn(newbody, newbodylen, body);
PL_strcatn(newbody, newbodylen, "</PRE>");
PR_Free(body);
body = newbody;
}

View File

@@ -160,7 +160,8 @@ MimeExternalObject_parse_begin (MimeObject *obj)
else
{
const char *p = "Part ";
char *s = (char *)PR_MALLOC(strlen(p) + strlen(id) + 1);
PRUint32 slen = strlen(p) + strlen(id) + 1;
char *s = (char *)PR_MALLOC(slen);
if (!s)
{
PR_Free(id);
@@ -170,8 +171,8 @@ MimeExternalObject_parse_begin (MimeObject *obj)
// we have a valid id
if (id)
id_name = mime_find_suggested_name_of_part(id, obj);
PL_strcpy(s, p);
PL_strcat(s, id);
PL_strncpyz(s, p, slen);
PL_strcatn(s, slen, id);
PR_Free(id);
id = s;
}

View File

@@ -185,14 +185,13 @@ test_image_make_image_html(void *image_data)
"an inlined image would have gone here for<BR>");
const char *suffix = "</TD></TR></TABLE></CENTER><P>";
#endif
char *buf;
buf = (char *) PR_MALLOC (strlen (prefix) + strlen (suffix) +
strlen (url) + 20);
PRUint32 buflen = strlen (prefix) + strlen (suffix) + strlen (url) + 20;
char *buf = (char *) PR_MALLOC (buflen);
if (!buf) return 0;
*buf = 0;
PL_strcat (buf, prefix);
PL_strcat (buf, url);
PL_strcat (buf, suffix);
PL_strcatn (buf, buflen, prefix);
PL_strcatn (buf, buflen, url);
PL_strcatn (buf, buflen, suffix);
return buf;
}

View File

@@ -1087,15 +1087,16 @@ mime_part_address(MimeObject *obj)
return strdup(buf);
else
{
char *s = (char *)PR_MALLOC(strlen(higher) + strlen(buf) + 3);
PRUint32 slen = strlen(higher) + strlen(buf) + 3;
char *s = (char *)PR_MALLOC(slen);
if (!s)
{
PR_Free(higher);
return 0; /* MIME_OUT_OF_MEMORY */
}
PL_strcpy(s, higher);
PL_strcat(s, ".");
PL_strcat(s, buf);
PL_strncpyz(s, higher, slen);
PL_strcatn(s, slen, ".");
PL_strcatn(s, slen, buf);
PR_Free(higher);
return s;
}
@@ -1229,7 +1230,8 @@ mime_set_url_part(const char *url, const char *part, PRBool append_p)
}
}
result = (char *) PR_MALLOC(strlen(url) + strlen(part) + 10);
PRUint32 resultlen = strlen(url) + strlen(part) + 10;
result = (char *) PR_MALLOC(resultlen);
if (!result) return 0;
if (part_begin)
@@ -1248,17 +1250,17 @@ mime_set_url_part(const char *url, const char *part, PRBool append_p)
}
else
{
PL_strcpy(result, url);
PL_strncpyz(result, url, resultlen);
if (got_q)
PL_strcat(result, "&part=");
PL_strcatn(result, resultlen, "&part=");
else
PL_strcat(result, "?part=");
PL_strcatn(result, resultlen, "?part=");
}
PL_strcat(result, part);
PL_strcatn(result, resultlen, part);
if (part_end && *part_end)
PL_strcat(result, part_end);
PL_strcatn(result, resultlen, part_end);
/* Semi-broken kludge to omit a trailing "?part=0". */
{
@@ -1287,15 +1289,15 @@ mime_set_url_imap_part(const char *url, const char *imappart, const char *libmim
*whereCurrent = 0;
}
result = (char *) PR_MALLOC(strlen(url) + strlen(imappart) + strlen(libmimepart) + 17);
PRUint32 resultLen = strlen(url) + strlen(imappart) + strlen(libmimepart) + 17;
result = (char *) PR_MALLOC(resultLen);
if (!result) return 0;
PL_strcpy(result, url);
PL_strcat(result, "/;section=");
PL_strcat(result, imappart);
PL_strcat(result, "?part=");
PL_strcat(result, libmimepart);
result[strlen(result)] = 0;
PL_strncpyz(result, url, resultLen);
PL_strcatn(result, resultLen, "/;section=");
PL_strcatn(result, resultLen, imappart);
PL_strcatn(result, resultLen, "?part=");
PL_strcatn(result, resultLen, libmimepart);
if (whereCurrent)
*whereCurrent = '/';
@@ -1605,11 +1607,11 @@ mime_parse_url_options(const char *url, MimeDisplayOptions *options)
else if (strcmp(options->part_to_load, "1")) /* not 1 */
{
const char *prefix = "1.";
char *s = (char *) PR_MALLOC(strlen(options->part_to_load) +
strlen(prefix) + 1);
PRUint32 slen = strlen(options->part_to_load) + strlen(prefix) + 1;
char *s = (char *) PR_MALLOC(slen);
if (!s) return MIME_OUT_OF_MEMORY;
PL_strcpy(s, prefix);
PL_strcat(s, options->part_to_load);
PL_strncpyz(s, prefix, slen);
PL_strcatn(s, slen, options->part_to_load);
PR_Free(options->part_to_load);
options->part_to_load = s;
}

View File

@@ -1209,15 +1209,15 @@ mime_image_make_image_html(void *image_closure)
else
url = mid->url;
buf = (char *) PR_MALLOC (strlen(prefix) + strlen(suffix) +
strlen(url) + 20) ;
PRUint32 buflen = strlen(prefix) + strlen(suffix) + strlen(url) + 20;
buf = (char *) PR_MALLOC (buflen);
if (!buf)
return 0;
*buf = 0;
PL_strcat (buf, prefix);
PL_strcat (buf, url);
PL_strcat (buf, suffix);
PL_strcatn (buf, buflen, prefix);
PL_strcatn (buf, buflen, url);
PL_strcatn (buf, buflen, suffix);
return buf;
}

View File

@@ -244,7 +244,7 @@ MimeMessage_parse_line (const char *aLine, PRInt32 aLength, MimeObject *obj)
char *s = (char *)PR_MALLOC(length + MSG_LINEBREAK_LEN + 1);
if (!s) return MIME_OUT_OF_MEMORY;
memcpy(s, line, length);
PL_strcpy(s + length, MSG_LINEBREAK);
PL_strncpyz(s + length, MSG_LINEBREAK, MSG_LINEBREAK_LEN);
status = kid->clazz->parse_buffer (s, length + MSG_LINEBREAK_LEN, kid);
PR_Free(s);
return status;

View File

@@ -116,7 +116,8 @@ MimeInlineTextHTML_parse_begin (MimeObject *obj)
if (base_hdr)
{
char *buf = (char *) PR_MALLOC(strlen(base_hdr) + 20);
PRUint32 buflen = strlen(base_hdr) + 20;
char *buf = (char *) PR_MALLOC(buflen);
const char *in;
char *out;
if (!buf)
@@ -129,7 +130,7 @@ MimeInlineTextHTML_parse_begin (MimeObject *obj)
mail header to be wrapped reasonably. Creators are supposed
to insert whitespace every 40 characters or less.
*/
PL_strcpy(buf, "<BASE HREF=\"");
PL_strncpyz(buf, "<BASE HREF=\"", buflen);
out = buf + strlen(buf);
for (in = base_hdr; *in; in++)

View File

@@ -120,11 +120,12 @@ MimeRichtextConvert (const char *line, PRInt32 length,
if (!IS_SPACE (*this_start)) break;
if (this_start >= line + length) /* blank line */
{
PL_strcpy (*obufferP, "<BR>");
PL_strncpyz (*obufferP, "<BR>", *obuffer_sizeP);
return output_fn (*obufferP, strlen(*obufferP), closure);
}
}
PRUint32 outlen = (PRUint32) *obuffer_sizeP;
out = *obufferP;
*out = 0;
@@ -132,6 +133,7 @@ MimeRichtextConvert (const char *line, PRInt32 length,
last_end = line;
this_start = last_end;
this_end = this_start;
PRUint32 addedlen = 0;
while (this_end < data_end)
{
/* Skip forward to next special character. */
@@ -161,24 +163,34 @@ MimeRichtextConvert (const char *line, PRInt32 length,
memcpy (out, last_end, this_start - last_end);
out += this_start - last_end;
*out = 0;
outlen -= (this_start - last_end);
}
if (this_start >= data_end)
break;
else if (*this_start == '&')
{
PL_strcpy (out, "&amp;"); out += strlen (out);
PL_strncpyz (out, "&amp;", outlen);
addedlen = strlen(out);
outlen -= addedlen;
out += addedlen;
}
else if (*this_start == '>')
{
PL_strcpy (out, "&gt;"); out += strlen (out);
PL_strncpyz (out, "&gt;", outlen);
addedlen = strlen(out);
outlen -= addedlen;
out += addedlen;
}
else if (enriched_p &&
this_start < data_end + 1 &&
this_start[0] == '<' &&
this_start[1] == '<')
{
PL_strcpy (out, "&lt;"); out += strlen (out);
PL_strncpyz (out, "&lt;", outlen);
addedlen = strlen(out);
outlen -= addedlen;
out += addedlen;
}
else if (this_start != this_end)
{
@@ -312,13 +324,17 @@ MimeRichtextConvert (const char *line, PRInt32 length,
if (this_start[1] == '/')
{
if (tag_close) PL_strcpy (out, tag_close);
out += strlen (out);
if (tag_close) PL_strncpyz (out, tag_close, outlen);
addedlen = strlen (out);
outlen -= addedlen;
out += addedlen;
}
else
{
if (tag_open) PL_strcpy (out, tag_open);
out += strlen (out);
if (tag_open) PL_strncpyz (out, tag_open, outlen);
addedlen = strlen (out);
outlen -= addedlen;
out += addedlen;
}
}

View File

@@ -319,47 +319,48 @@ MimeUntypedText_open_subpart (MimeObject *obj,
uty->open_hdrs = MimeHeaders_new();
if (!uty->open_hdrs) return MIME_OUT_OF_MEMORY;
h = (char *) PR_MALLOC(strlen(type) +
(enc ? strlen(enc) : 0) +
(desc ? strlen(desc) : 0) +
(name ? strlen(name) : 0) +
100);
PRUint32 hlen = strlen(type) +
(enc ? strlen(enc) : 0) +
(desc ? strlen(desc) : 0) +
(name ? strlen(name) : 0) +
100;
h = (char *) PR_MALLOC(hlen);
if (!h) return MIME_OUT_OF_MEMORY;
PL_strcpy(h, HEADER_CONTENT_TYPE ": ");
PL_strcat(h, type);
PL_strcat(h, MSG_LINEBREAK);
PL_strncpyz(h, HEADER_CONTENT_TYPE ": ", hlen);
PL_strcatn(h, hlen, type);
PL_strcatn(h, hlen, MSG_LINEBREAK);
status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs);
if (status < 0) goto FAIL;
if (enc)
{
PL_strcpy(h, HEADER_CONTENT_TRANSFER_ENCODING ": ");
PL_strcat(h, enc);
PL_strcat(h, MSG_LINEBREAK);
PL_strncpyz(h, HEADER_CONTENT_TRANSFER_ENCODING ": ", hlen);
PL_strcatn(h, hlen, enc);
PL_strcatn(h, hlen, MSG_LINEBREAK);
status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs);
if (status < 0) goto FAIL;
}
if (desc)
{
PL_strcpy(h, HEADER_CONTENT_DESCRIPTION ": ");
PL_strcat(h, desc);
PL_strcat(h, MSG_LINEBREAK);
PL_strncpyz(h, HEADER_CONTENT_DESCRIPTION ": ", hlen);
PL_strcatn(h, hlen, desc);
PL_strcatn(h, hlen, MSG_LINEBREAK);
status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs);
if (status < 0) goto FAIL;
}
if (name)
{
PL_strcpy(h, HEADER_CONTENT_DISPOSITION ": inline; filename=\"");
PL_strcat(h, name);
PL_strcat(h, "\"" MSG_LINEBREAK);
PL_strncpyz(h, HEADER_CONTENT_DISPOSITION ": inline; filename=\"", hlen);
PL_strcatn(h, hlen, name);
PL_strcatn(h, hlen, "\"" MSG_LINEBREAK);
status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs);
if (status < 0) goto FAIL;
}
/* push out a blank line. */
PL_strcpy(h, MSG_LINEBREAK);
PL_strncpyz(h, MSG_LINEBREAK, hlen);
status = MimeHeaders_parse_line(h, strlen(h), uty->open_hdrs);
if (status < 0) goto FAIL;

View File

@@ -1422,6 +1422,7 @@ msg_remove_duplicate_addresses(const char *addrs, const char *other_addrs,
char **a_array1 = 0, **a_array2 = 0, **a_array3 = 0;
char **n_array1 = 0, **n_array3 = 0;
int i, j;
PRUint32 addedlen = 0;
count1 = msg_parse_Header_addresses(addrs, &names1, &addrs1);
if (count1 < 0) goto FAIL;
@@ -1531,8 +1532,9 @@ msg_remove_duplicate_addresses(const char *addrs, const char *other_addrs,
if (count3 > count1) break;
}
}
output = (char *)PR_Malloc(size3 + 1);
PRUint32 outlen = size3 + 1;
output = (char *)PR_Malloc(outlen);
if (!output) goto FAIL;
*output = 0;
@@ -1540,15 +1542,19 @@ msg_remove_duplicate_addresses(const char *addrs, const char *other_addrs,
s2 = output;
for (i = 0; i < count3; i++)
{
PL_strcpy(out, a_array3[i]);
out += strlen(out);
PL_strncpyz(out, a_array3[i], outlen);
addedlen = strlen(out);
outlen -= addedlen;
out += addedlen;
*out++ = 0;
}
s1 = out;
for (i = 0; i < count3; i++)
{
PL_strcpy(out, n_array3[i]);
out += strlen(out);
PL_strncpyz(out, n_array3[i], outlen);
addedlen = strlen(out);
outlen -= addedlen;
out += addedlen;
*out++ = 0;
}
result = msg_format_Header_addresses(s1, s2, count3, PR_FALSE);
@@ -1580,26 +1586,34 @@ msg_make_full_address(const char* name, const char* addr)
int nl = name ? strlen (name) : 0;
int al = addr ? strlen (addr) : 0;
char *buf, *s;
PRUint32 buflen, slen;
int L;
if (al == 0)
return 0;
buf = (char *)PR_Malloc((nl * 2) + (al * 2) + 20);
buflen = (nl * 2) + (al * 2) + 25;
buf = (char *)PR_Malloc(buflen);
if (!buf)
return 0;
if (nl > 0)
{
PL_strcpy(buf, name);
PL_strncpyz(buf, name, buflen);
L = msg_quote_phrase_or_addr(buf, nl, PR_FALSE);
s = buf + L;
*s++ = ' ';
*s++ = '<';
slen = buflen - L;
if ( slen > 2 ) {
*s++ = ' ';
*s++ = '<';
slen -= 2; // for ' ' and '<'
}
}
else
{
s = buf;
slen = buflen;
}
PL_strcpy(s, addr);
PL_strncpyz(s, addr, slen);
L = msg_quote_phrase_or_addr(s, al, PR_TRUE);
s += L;
if (nl > 0)