From: Richard Kettlewell Date: Sun, 1 Mar 2009 19:13:49 +0000 (+0000) Subject: Add xcalloc_noptr(), which allows uaudio-thread.c to ask for X-Git-Tag: 5.0~168^2~6 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/8e93ddd109ce3cc88ffaa80e8f5e578808adb1a2 Add xcalloc_noptr(), which allows uaudio-thread.c to ask for pointerless buffers. Also convenient for unicode.c. --- diff --git a/lib/mem.c b/lib/mem.c index 5f08b90..89570ab 100644 --- a/lib/mem.c +++ b/lib/mem.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004, 2005, 2006, 2007 Richard Kettlewell + * Copyright (C) 2004, 2005, 2006, 2007, 2009 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -136,6 +136,20 @@ void *xmalloc_noptr(size_t n) { return ptr; } +/** @brief Allocate memory + * @param count Number of objects to allocate + * @param size Size of one object + * @return Pointer to allocated memory + * + * Terminates the process on error. IMPORTANT: the allocated memory is NOT + * 0-filled (unlike @c calloc()). + */ +void *xcalloc_noptr(size_t count, size_t size) { + if(count > SIZE_MAX / size) + fatal(0, "excessively large calloc"); + return xmalloc_noptr(count * size); +} + /** @brief Reallocate memory * @param ptr Block to reallocated * @param n Bytes to allocate @@ -196,5 +210,7 @@ void xfree(void *ptr) { Local Variables: c-basic-offset:2 comment-column:40 +fill-column:79 +indent-tabs-mode:nil End: */ diff --git a/lib/mem.h b/lib/mem.h index 2aa70aa..46412eb 100644 --- a/lib/mem.h +++ b/lib/mem.h @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004-2008 Richard Kettlewell + * Copyright (C) 2004-2009 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -42,6 +42,7 @@ void *xcalloc(size_t count, size_t size); void *xmalloc_noptr(size_t); void *xrealloc_noptr(void *, size_t); +void *xcalloc_noptr(size_t count, size_t size); char *xstrdup(const char *); char *xstrndup(const char *, size_t); /* As malloc/realloc/strdup, but diff --git a/lib/uaudio-thread.c b/lib/uaudio-thread.c index 3253a1d..cd0d727 100644 --- a/lib/uaudio-thread.c +++ b/lib/uaudio-thread.c @@ -208,7 +208,8 @@ void uaudio_thread_start(uaudio_callback *callback, uaudio_thread_max = max; uaudio_thread_started = 1; for(int n = 0; n < UAUDIO_THREAD_BUFFERS; ++n) - uaudio_buffers[n].samples = xcalloc(uaudio_thread_max, uaudio_sample_size); + uaudio_buffers[n].samples = xcalloc_noptr(uaudio_thread_max, + uaudio_sample_size); uaudio_collect_buffer = uaudio_play_buffer = 0; if((e = pthread_create(&uaudio_collect_thread, NULL, diff --git a/lib/unicode.c b/lib/unicode.c index 3adbea0..55390eb 100644 --- a/lib/unicode.c +++ b/lib/unicode.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2007 Richard Kettlewell + * Copyright (C) 2007, 2009 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1358,8 +1358,10 @@ uint32_t **utf32_word_split(const uint32_t *s, size_t ns, size_t *nwp, } /* If it's a word add it to the list of results */ if(isword) { - w = xcalloc(b2 - b1 + 1, sizeof(uint32_t)); - memcpy(w, it->s + b1, (b2 - b1) * sizeof (uint32_t)); + const size_t len = b2 - b1; + w = xcalloc_noptr(len + 1, sizeof(uint32_t)); + memcpy(w, it->s + b1, len * sizeof (uint32_t)); + w[len] = 0; vector32_append(v32, w); } }