From 8e93ddd109ce3cc88ffaa80e8f5e578808adb1a2 Mon Sep 17 00:00:00 2001 Message-Id: <8e93ddd109ce3cc88ffaa80e8f5e578808adb1a2.1713308450.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 1 Mar 2009 19:13:49 +0000 Subject: [PATCH] Add xcalloc_noptr(), which allows uaudio-thread.c to ask for pointerless buffers. Also convenient for unicode.c. Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/mem.c | 18 +++++++++++++++++- lib/mem.h | 3 ++- lib/uaudio-thread.c | 3 ++- lib/unicode.c | 8 +++++--- 4 files changed, 26 insertions(+), 6 deletions(-) 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); } } -- [mdw]