summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib.c24
-rw-r--r--lib.h1
-rw-r--r--stream.c2
-rw-r--r--utf8.c4
4 files changed, 20 insertions, 11 deletions
diff --git a/lib.c b/lib.c
index 4d0537b6..b3657a60 100644
--- a/lib.c
+++ b/lib.c
@@ -2025,10 +2025,18 @@ mem_t *chk_grow_vec(mem_t *old, size_t oldelems, size_t newelems,
return chk_realloc(old, bytes);
}
+wchar_t *chk_wmalloc(size_t nwchar)
+{
+ size_t size = nwchar * sizeof (wchar_t);
+ if (size < nwchar)
+ uw_throw(error_s, lit("string size overflow"));
+ return coerce(wchar_t *, chk_malloc(sizeof (wchar_t) * nwchar));
+}
+
wchar_t *chk_strdup(const wchar_t *str)
{
size_t nchar = wcslen(str) + 1;
- wchar_t *copy = coerce(wchar_t *, chk_malloc(nchar * sizeof *copy));
+ wchar_t *copy = chk_wmalloc(nchar);
assert (!async_sig_enabled);
wmemcpy(copy, str, nchar);
return copy;
@@ -2509,7 +2517,7 @@ val string_utf8(const char *str)
val mkstring(val len, val ch)
{
size_t l = c_num(len);
- wchar_t *str = coerce(wchar_t *, chk_malloc((l + 1) * sizeof *str));
+ wchar_t *str = chk_wmalloc(l + 1);
val s = string_own(str);
wmemset(str, c_chr(ch), l);
str[l] = 0;
@@ -2521,7 +2529,7 @@ val mkstring(val len, val ch)
val mkustring(val len)
{
cnum l = c_num(len);
- wchar_t *str = coerce(wchar_t *, chk_malloc((l + 1) * sizeof *str));
+ wchar_t *str = chk_wmalloc(l + 1);
val s = string_own(str);
str[l] = 0;
s->st.len = len;
@@ -2543,7 +2551,7 @@ val copy_str(val str)
val upcase_str(val str)
{
val len = length_str(str);
- wchar_t *dst = coerce(wchar_t *, chk_malloc((c_num(len) + 1) * sizeof *dst));
+ wchar_t *dst = chk_wmalloc(c_num(len) + 1);
const wchar_t *src = c_str(str);
val out = string_own(dst);
@@ -2556,7 +2564,7 @@ val upcase_str(val str)
val downcase_str(val str)
{
val len = length_str(str);
- wchar_t *dst = coerce(wchar_t *, chk_malloc((c_num(len) + 1) * sizeof *dst));
+ wchar_t *dst = chk_wmalloc(c_num(len) + 1);
const wchar_t *src = c_str(str);
val out = string_own(dst);
@@ -2891,7 +2899,7 @@ val sub_str(val str_in, val from, val to)
return null_string;
} else {
size_t nchar = c_num(to) - c_num(from) + 1;
- wchar_t *sub = coerce(wchar_t *, chk_malloc(nchar * sizeof *sub));
+ wchar_t *sub = chk_wmalloc(nchar);
const wchar_t *str = c_str(str_in);
wcsncpy(sub, str + c_num(from), nchar);
sub[nchar-1] = 0;
@@ -3056,7 +3064,7 @@ val cat_str(val list, val sep)
item, nao);
}
- str = coerce(wchar_t *, chk_malloc((total + 1) * sizeof *str));
+ str = chk_wmalloc(total + 1);
for (ptr = str, iter = list; iter != nil; iter = cdr(iter)) {
val item = car(iter);
@@ -3269,7 +3277,7 @@ val trim_str(val str)
return null_string;
} else {
size_t len = end - start;
- wchar_t *buf = coerce(wchar_t *, chk_malloc((len + 1) * sizeof *buf));
+ wchar_t *buf = chk_wmalloc(len + 1);
wmemcpy(buf, start, len);
buf[len] = 0;
return string_own(buf);
diff --git a/lib.h b/lib.h
index b9fa99e5..41b8608b 100644
--- a/lib.h
+++ b/lib.h
@@ -535,6 +535,7 @@ mem_t *chk_calloc(size_t n, size_t size);
mem_t *chk_realloc(mem_t *, size_t size);
mem_t *chk_grow_vec(mem_t *old, size_t oldelems, size_t newelems,
size_t elsize);
+wchar_t *chk_wmalloc(size_t nwchar);
wchar_t *chk_strdup(const wchar_t *str);
char *chk_strdup_utf8(const char *str);
val cons(val car, val cdr);
diff --git a/stream.c b/stream.c
index 950e687d..5e249267 100644
--- a/stream.c
+++ b/stream.c
@@ -1553,7 +1553,7 @@ val make_string_output_stream(void)
struct string_out *so = coerce(struct string_out *, chk_malloc(sizeof *so));
strm_base_init(&so->a);
so->size = 128;
- so->buf = coerce(wchar_t *, chk_malloc(so->size * sizeof so->buf));
+ so->buf = chk_wmalloc(so->size);
so->fill = 0;
so->buf[0] = 0;
utf8_decoder_init(&so->ud);
diff --git a/utf8.c b/utf8.c
index a45c1b94..a09e082b 100644
--- a/utf8.c
+++ b/utf8.c
@@ -203,7 +203,7 @@ size_t utf8_to(char *dst, const wchar_t *wsrc)
wchar_t *utf8_dup_from_uc(const unsigned char *str)
{
size_t nchar = utf8_from_uc(0, str);
- wchar_t *wstr = coerce(wchar_t *, chk_malloc(nchar * sizeof *wstr));
+ wchar_t *wstr = chk_wmalloc(nchar);
utf8_from_uc(wstr, str);
return wstr;
}
@@ -211,7 +211,7 @@ wchar_t *utf8_dup_from_uc(const unsigned char *str)
wchar_t *utf8_dup_from(const char *str)
{
size_t nchar = utf8_from(0, str);
- wchar_t *wstr = coerce(wchar_t *, chk_malloc(nchar * sizeof *wstr));
+ wchar_t *wstr = chk_wmalloc(nchar);
utf8_from(wstr, str);
return wstr;
}