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); }