Print this page
Address Robert's feedback
*** 99,108 ****
--- 99,112 ----
static boolean_t
str_reserve(str_t *s, size_t amt)
{
size_t newlen = s->str_len + amt;
+ /* overflow check */
+ if (newlen < s->str_len || newlen < amt)
+ return (B_FALSE);
+
if ((amt > 0) && (s->str_len + amt <= s->str_size))
return (B_TRUE);
size_t newsize = roundup(newlen, STR_CHUNK_SZ);
void *temp;
*** 161,171 ****
dest->str_len += src->str_len;
return (B_TRUE);
}
boolean_t
! str_append_c(str_t *s, int c)
{
if (!str_reserve(s, 1))
return (B_FALSE);
s->str_s[s->str_len++] = c;
--- 165,175 ----
dest->str_len += src->str_len;
return (B_TRUE);
}
boolean_t
! str_append_c(str_t *s, char c)
{
if (!str_reserve(s, 1))
return (B_FALSE);
s->str_s[s->str_len++] = c;
*** 207,219 ****
}
if (!str_reserve(dest, src->str_len))
return (B_FALSE);
! /* Unlike some programmers, *I* can read manpages. */
(void) memmove(dest->str_s + idx + src->str_len, dest->str_s + idx,
dest->str_len - idx);
(void) memcpy(dest->str_s + idx, src->str_s, src->str_len);
dest->str_len += src->str_len;
return (B_TRUE);
}
--- 211,233 ----
}
if (!str_reserve(dest, src->str_len))
return (B_FALSE);
! /*
! * Shift the contents of dest over at the insertion point. Since
! * src and dest ranges will overlap, and unlike some programmers,
! * *I* can read man pages - memmove() is the appropriate function
! * to this.
! */
(void) memmove(dest->str_s + idx + src->str_len, dest->str_s + idx,
dest->str_len - idx);
+
+ /*
+ * However the content to insert does not overlap with the destination
+ * so memcpy() is fine here.
+ */
(void) memcpy(dest->str_s + idx, src->str_s, src->str_len);
dest->str_len += src->str_len;
return (B_TRUE);
}