From: Andre Noll Date: Mon, 3 Oct 2022 15:59:56 +0000 (+0200) Subject: Merge topic branch t/overflow into master X-Git-Tag: v0.7.1~1 X-Git-Url: http://git.tuebingen.mpg.de/?a=commitdiff_plain;h=563b56a493d6a2bdcdebafadd907954dbe1de8a8;hp=82aedc35a6cdf2c7e0d27fc16f75529722505dac;p=paraslash.git Merge topic branch t/overflow into master This series implements a new memory allocation API which checks for overflows. The first part of the series just renames the main allocation functions. Later patches in the series implement allocators which take two size_t arguments (like calloc(3)) and check whether the multiplication overflows by employing the __builtin_mul_overflow() primitive supported by gcc and clang. This requires us to bump the lowest supported gcc and clang version. * refs/heads/t/overflow: build: Compile with -ftrapv. string: Introduce arr_zalloc(). string: Introduce arr_alloc(). string: Introduce arr_realloc() and check for integer overflow. string: Rename para_calloc() -> zalloc(). string: Rename para_malloc() -> alloc(). string: Overhaul para_strdup(). --- diff --git a/Makefile.real b/Makefile.real index 92ef9952..4dac79f9 100644 --- a/Makefile.real +++ b/Makefile.real @@ -121,6 +121,7 @@ CPPFLAGS += -I$(yy_build_dir) CPPFLAGS += $(lopsub_cppflags) STRICT_CFLAGS += -fno-strict-aliasing +STRICT_CFLAGS += -ftrapv STRICT_CFLAGS += -g STRICT_CFLAGS += -Os STRICT_CFLAGS += -Wundef -W -Wuninitialized diff --git a/NEWS.md b/NEWS.md index e5b99010..a6af789b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -15,6 +15,9 @@ NEWS new ll command. It is available for para_server and para_audiod. - All calls to select(2) have been replaced by calls to poll(2) to avoid known shortcomings of the select API. +- All allocation functions now check for integer overflow. Since this + requires support from the compiler, the oldest supported gcc version + has been bumped to gcc-5.4 (released in 2015). [tarball](./releases/paraslash-git.tar.xz) diff --git a/aac_afh.c b/aac_afh.c index 79fa30dd..c4301a2f 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -59,7 +59,7 @@ static off_t aac_afh_seek_cb(void *user_data, off_t offset, int whence) static int aac_afh_open(const void *map, size_t mapsize, void **afh_context) { int ret; - struct aac_afh_context *c = para_malloc(sizeof(*c)); + struct aac_afh_context *c = alloc(sizeof(*c)); c->map = map; c->mapsize = mapsize; diff --git a/aacdec_filter.c b/aacdec_filter.c index 36a783c5..87a7900a 100644 --- a/aacdec_filter.c +++ b/aacdec_filter.c @@ -52,7 +52,7 @@ static int aacdec_execute(struct btr_node *btrn, const char *cmd, char **result) static void aacdec_open(struct filter_node *fn) { NeAACDecConfigurationPtr c; - struct private_aacdec_data *padd = para_calloc(sizeof(*padd)); + struct private_aacdec_data *padd = zalloc(sizeof(*padd)); padd->handle = NeAACDecOpen(); c = NeAACDecGetCurrentConfiguration(padd->handle); @@ -136,7 +136,7 @@ next_buffer: consumed += frame_info.bytesconsumed; if (!frame_info.samples) goto success; - btrbuf = para_malloc(2 * frame_info.samples); + btrbuf = arr_alloc(2, frame_info.samples); for (i = 0; i < frame_info.samples; i++) { short sh = ((short *)outbuf)[i]; write_int16_host_endian(btrbuf + loaded, sh); diff --git a/acl.c b/acl.c index 59ffab3e..ddf93ecc 100644 --- a/acl.c +++ b/acl.c @@ -81,7 +81,7 @@ no_match: */ void acl_add_entry(struct list_head *acl, char *addr, int netmask) { - struct access_info *ai = para_malloc(sizeof(struct access_info)); + struct access_info *ai = alloc(sizeof(struct access_info)); inet_pton(AF_INET, addr, &ai->addr); ai->netmask = netmask; diff --git a/afh_recv.c b/afh_recv.c index 889fdce8..eebac67f 100644 --- a/afh_recv.c +++ b/afh_recv.c @@ -75,7 +75,7 @@ static int afh_recv_open(struct receiver_node *rn) if (!fn || *fn == '\0') return -E_AFH_RECV_BAD_FILENAME; - rn->private_data = pard = para_calloc(sizeof(*pard)); + rn->private_data = pard = zalloc(sizeof(*pard)); afhi = &pard->afhi; ret = mmap_full_file(fn, O_RDONLY, &pard->map, &pard->map_size, &pard->fd); @@ -188,7 +188,7 @@ static int afh_recv_post_monitor(__a_unused struct sched *s, void *context) pard->map_size, &header, &size); if (size > 0) { PARA_INFO_LOG("writing header (%zu bytes)\n", size); - buf = para_malloc(size); + buf = alloc(size); memcpy(buf, header, size); btr_add_output(buf, size, btrn); afh_free_header(header, pard->audio_format_num); diff --git a/afs.c b/afs.c index f2908029..3da39f32 100644 --- a/afs.c +++ b/afs.c @@ -960,7 +960,7 @@ static int command_post_monitor(struct sched *s, void *context) close(fd); return 0; } - client = para_malloc(sizeof(*client)); + client = alloc(sizeof(*client)); client->fd = fd; client->connect_time = *now; para_list_add(&client->node, &afs_client_list); diff --git a/aft.c b/aft.c index e0bde7fc..f690e819 100644 --- a/aft.c +++ b/aft.c @@ -412,7 +412,7 @@ static void load_chunk_table(struct afh_info *afhi, const struct osl_object *ct) return; } sz = PARA_MIN(((size_t)afhi->chunks_total + 1) * 4, ct->size) + 1; - afhi->chunk_table = para_malloc(sz); + afhi->chunk_table = alloc(sz); for (i = 0; i <= afhi->chunks_total && i * 4 + 3 < ct->size; i++) afhi->chunk_table[i] = read_u32(ct->data + 4 * i); } @@ -1066,7 +1066,7 @@ again: if (ret < 0) return ret; if (!d->hash) - d->hash = para_malloc(HASH_SIZE); + d->hash = alloc(HASH_SIZE); memcpy(d->hash, tmp_hash, HASH_SIZE); free(d->path); ret = get_audio_file_path_of_row(current_aft_row, &d->path); @@ -1224,7 +1224,7 @@ static int sort_matching_paths(struct ls_options *options) int (*compar)(const void *, const void *); int i; - options->data_ptr = para_malloc(nmemb * sizeof(*options->data_ptr)); + options->data_ptr = arr_alloc(nmemb, sizeof(*options->data_ptr)); for (i = 0; i < nmemb; i++) options->data_ptr[i] = options->data + i; @@ -1317,8 +1317,8 @@ static int prepare_ls_row(struct osl_row *row, void *ls_opts) if (options->num_matching_paths > options->array_size) { options->array_size++; options->array_size *= 2; - options->data = para_realloc(options->data, options->array_size - * sizeof(*options->data)); + options->data = arr_realloc(options->data, options->array_size, + sizeof(*options->data)); } d = options->data + tmp; ret = get_afsi_of_row(aft_row, &d->afsi); @@ -1424,7 +1424,7 @@ static int com_ls(struct command_context *cc, struct lls_parse_result *lpr) ret = lls_serialize_parse_result(lpr, cmd, NULL, &query.size); assert(ret >= 0); query.size += sizeof(*opts); - query.data = para_malloc(query.size); + query.data = alloc(query.size); opts = query.data; memset(opts, 0, sizeof(*opts)); slpr = query.data + sizeof(*opts); @@ -1553,7 +1553,7 @@ static void save_add_callback_buffer(unsigned char *hash, const char *path, size_t afhi_size = sizeof_afhi_buf(afhi); size_t size = CAB_PATH_OFFSET + path_len + afhi_size + sizeof_chunk_table(afhi) + slpr_size; - char *buf = para_malloc(size); + char *buf = alloc(size); uint32_t pos; assert(size <= ~(uint32_t)0); @@ -2320,7 +2320,7 @@ static int com_setatt_callback(struct afs_callback_arg *aca) goto out; /* no attribute modifier given */ goto set_atts; } - p = para_malloc(len); + p = alloc(len); memcpy(p, arg, len - 1); p[len - 1] = '\0'; ret = get_attribute_bitnum_by_name(p, &bitnum); diff --git a/alsa_mix.c b/alsa_mix.c index 1d81e5d9..af4adc46 100644 --- a/alsa_mix.c +++ b/alsa_mix.c @@ -52,7 +52,7 @@ static int alsa_mix_open(const char *dev, struct mixer_handle **handle) PARA_INFO_LOG("snd_mixer_{open,attach,register,load}\n"); *handle = NULL; - h = para_calloc(sizeof(*h)); + h = zalloc(sizeof(*h)); h->card = para_strdup(dev? dev : "hw:0"); ret = snd_mixer_open(&h->mixer, 0); if (ret < 0) { diff --git a/alsa_write.c b/alsa_write.c index 2bf3fd0e..92d6cb70 100644 --- a/alsa_write.c +++ b/alsa_write.c @@ -296,7 +296,7 @@ again: if (bytes == 0) /* no data available */ return 0; - pad = wn->private_data = para_calloc(sizeof(*pad)); + pad = wn->private_data = zalloc(sizeof(*pad)); ret = get_btr_sample_rate(btrn, &val); if (ret < 0) goto err; diff --git a/amp_filter.c b/amp_filter.c index 9369e4bc..360e3fc2 100644 --- a/amp_filter.c +++ b/amp_filter.c @@ -29,7 +29,7 @@ static void amp_close(struct filter_node *fn) static void amp_open(struct filter_node *fn) { - struct private_amp_data *pad = para_calloc(sizeof(*pad)); + struct private_amp_data *pad = zalloc(sizeof(*pad)); unsigned given = FILTER_CMD_OPT_GIVEN(AMP, AMP, fn->lpr); uint32_t amp_arg = FILTER_CMD_OPT_UINT32_VAL(AMP, AMP, fn->lpr); @@ -74,7 +74,7 @@ next_buffer: if (inplace) out = in; else - out = para_malloc(len * 2); + out = alloc(len * 2); for (i = 0; i < len; i++) { int x = (in[i] * factor) >> 6; diff --git a/ao_write.c b/ao_write.c index 41e609b7..950f8f73 100644 --- a/ao_write.c +++ b/ao_write.c @@ -184,7 +184,7 @@ static int aow_init(struct writer_node *wn, unsigned sample_rate, ao_info *info; const struct lls_opt_result *r; unsigned n; - struct private_aow_data *pawd = para_malloc(sizeof(*pawd)); + struct private_aow_data *pawd = alloc(sizeof(*pawd)); ao_initialize(); aow_show_drivers(); diff --git a/audioc.c b/audioc.c index 5f91e3b7..d6c14cbc 100644 --- a/audioc.c +++ b/audioc.c @@ -171,7 +171,7 @@ static int audioc_post_monitor(struct sched *s, void *context) if (!sched_read_ok(at->fd, s)) return 0; bufsize = PARA_MAX(1024U, OPT_UINT32_VAL(BUFSIZE)); - buf = para_malloc(bufsize); + buf = alloc(bufsize); ret = recv_bin_buffer(at->fd, buf, bufsize); PARA_DEBUG_LOG("recv: %d\n", ret); if (ret == 0) @@ -370,7 +370,7 @@ int main(int argc, char *argv[]) if (ret < 0) goto out; bufsize = PARA_MAX(1024U, OPT_UINT32_VAL(BUFSIZE)); - buf = para_malloc(bufsize); + buf = alloc(bufsize); do { size_t n = ret = recv_bin_buffer(fd, buf, bufsize); if (ret <= 0) diff --git a/audiod.c b/audiod.c index c29cf3ad..0e8e5981 100644 --- a/audiod.c +++ b/audiod.c @@ -391,7 +391,7 @@ static void parse_config_or_die(void) n = OPT_GIVEN(USER_ALLOW); if (n == 0) return; - uid_whitelist = para_malloc(n * sizeof(uid_t)); + uid_whitelist = arr_alloc(n, sizeof(uid_t)); for (i = 0; i < n; i++) { const char *arg = lls_string_val(i, OPT_RESULT(USER_ALLOW)); int32_t val; @@ -562,7 +562,7 @@ static void open_filters(struct slot_info *s) return; PARA_INFO_LOG("opening %s filters\n", audio_formats[s->format]); assert(s->fns == NULL); - s->fns = para_calloc(nf * sizeof(struct filter_node)); + s->fns = zalloc(nf * sizeof(struct filter_node)); parent = s->receiver_node->btrn; for (i = 0; i < nf; i++) { char buf[20]; @@ -600,7 +600,7 @@ static void open_writers(struct slot_info *s) struct btr_node *parent = s->fns[a->num_filters - 1].btrn; assert(s->wns == NULL); - s->wns = para_calloc(PARA_MAX(1U, a->num_writers) + s->wns = zalloc(PARA_MAX(1U, a->num_writers) * sizeof(struct writer_node)); for (i = 0; i < a->num_writers; i++) { wn = s->wns + i; @@ -627,7 +627,7 @@ static int open_receiver(int format) if (ret < 0) return ret; slot_num = ret; - rn = para_calloc(sizeof(*rn)); + rn = zalloc(sizeof(*rn)); rn->receiver = r; rn->lpr = a->receiver_lpr; rn->btrn = btr_new_node(&(struct btr_node_description) @@ -817,7 +817,7 @@ static int parse_stream_command(const char *txt, const char **cmd) return -E_MISSING_COLON; *cmd = p + 1; len = p - txt; - re = para_malloc(len + 1); + re = alloc(len + 1); strncpy(re, txt, len); re[len] = '\0'; ret = get_matching_audio_format_nums(re); @@ -833,12 +833,9 @@ static int add_filter(int format, const char *cmdline) struct lls_parse_result *flpr; filter_num = filter_setup(cmdline, &cfg, &flpr); - a->filter_lpr = para_realloc(a->filter_lpr, - (nf + 1) * sizeof(flpr)); - a->filter_conf = para_realloc(a->filter_conf, - (nf + 1) * sizeof(void *)); - a->filter_nums = para_realloc(a->filter_nums, - (nf + 1) * sizeof(unsigned)); + a->filter_lpr = arr_realloc(a->filter_lpr, nf + 1, sizeof(flpr)); + a->filter_conf = arr_realloc(a->filter_conf, nf + 1, sizeof(void *)); + a->filter_nums = arr_realloc(a->filter_nums, nf + 1, sizeof(unsigned)); a->filter_nums[nf] = filter_num; a->filter_conf[nf] = cfg; @@ -884,8 +881,8 @@ static int parse_writer_args(void) if (a->num_writers > 0) continue; /* already set up */ a->num_writers = 1; - a->wids = para_malloc(sizeof(int)); - a->writer_lpr = para_malloc(sizeof(struct lls_parse_result *)); + a->wids = alloc(sizeof(int)); + a->writer_lpr = alloc(sizeof(struct lls_parse_result *)); a->wids[0] = check_writer_arg_or_die(NULL, a->writer_lpr); PARA_INFO_LOG("%s writer: %s (default)\n", audio_formats[i], writer_name(a->wids[0])); diff --git a/audiod_command.c b/audiod_command.c index 29c330f3..6e2f8ee9 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -114,7 +114,7 @@ static int stat_client_add(int fd, uint64_t mask, int parser_friendly) ret = dup(fd); if (ret < 0) return -ERRNO_TO_PARA_ERROR(errno); - new_client = para_calloc(sizeof(*new_client)); + new_client = zalloc(sizeof(*new_client)); new_client->fd = ret; PARA_INFO_LOG("adding client on fd %d\n", new_client->fd); new_client->item_mask = mask; diff --git a/base64.c b/base64.c index 122465f8..ac6f65aa 100644 --- a/base64.c +++ b/base64.c @@ -79,7 +79,7 @@ int base64_decode(char const *src, size_t encoded_size, char **result, if (encoded_size == (size_t)-1) encoded_size = strlen(src); - target = para_malloc(BASE64_MAX_DECODED_SIZE(encoded_size) + 1); + target = alloc(BASE64_MAX_DECODED_SIZE(encoded_size) + 1); for ( i = 0, j = 0, state = 0; diff --git a/bitstream.c b/bitstream.c index dfc1e55e..a1c7c943 100644 --- a/bitstream.c +++ b/bitstream.c @@ -46,8 +46,8 @@ static void alloc_table(struct vlc *vlc, int size) vlc->table_size += size; if (vlc->table_size > vlc->table_allocated) { vlc->table_allocated += (1 << vlc->bits); - vlc->table = para_realloc(vlc->table, - sizeof(int16_t) * 2 * vlc->table_allocated); + vlc->table = arr_realloc(vlc->table, vlc->table_allocated, + sizeof(int16_t) * 2); } } diff --git a/blob.c b/blob.c index 4ecbc45b..b6372401 100644 --- a/blob.c +++ b/blob.c @@ -403,7 +403,7 @@ static int stdin_command(struct command_context *cc, if (ret < 0) return ret; query.size = len + 1 + stdin_obj.size; - query.data = para_malloc(query.size); + query.data = alloc(query.size); memcpy(query.data, lls_input(0, lpr), len + 1); if (stdin_obj.size > 0) memcpy((char *)query.data + len + 1, stdin_obj.data, diff --git a/buffer_tree.c b/buffer_tree.c index 49e40fb9..05cdfa83 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -72,8 +72,8 @@ struct btr_pool *btr_pool_new(const char *name, size_t area_size) struct btr_pool *btrp; PARA_INFO_LOG("%s, %zu bytes\n", name, area_size); - btrp = para_malloc(sizeof(*btrp)); - btrp->area_start = para_malloc(area_size); + btrp = alloc(sizeof(*btrp)); + btrp->area_start = alloc(area_size); btrp->area_end = btrp->area_start + area_size; btrp->rhead = btrp->area_start; btrp->whead = btrp->area_start; @@ -262,7 +262,7 @@ static void btr_pool_deallocate(struct btr_pool *btrp, size_t size) */ struct btr_node *btr_new_node(struct btr_node_description *bnd) { - struct btr_node *btrn = para_malloc(sizeof(*btrn)); + struct btr_node *btrn = alloc(sizeof(*btrn)); btrn->name = para_strdup(bnd->name); btrn->parent = bnd->parent; @@ -307,7 +307,7 @@ out: */ static struct btr_buffer *new_btrb(char *buf, size_t size) { - struct btr_buffer *btrb = para_calloc(sizeof(*btrb)); + struct btr_buffer *btrb = zalloc(sizeof(*btrb)); btrb->buf = buf; btrb->size = size; @@ -354,7 +354,7 @@ static void add_btrb_to_children(struct btr_buffer *btrb, if (btrn->start.tv_sec == 0) btrn->start = *now; FOR_EACH_CHILD(ch, btrn) { - struct btr_buffer_reference *br = para_calloc(sizeof(*br)); + struct btr_buffer_reference *br = zalloc(sizeof(*br)); br->btrb = btrb; br->consumed = consumed; list_add_tail(&br->node, &ch->input_queue); @@ -1007,12 +1007,12 @@ next: if (!wbr) { /* Make a new wrap buffer combining buf1 and buf2. */ sz = sz1 + sz2; - buf = para_malloc(sz); + buf = alloc(sz); PARA_DEBUG_LOG("merging input buffers: (%p:%zu, %p:%zu) -> %p:%zu\n", buf1, sz1, buf2, sz2, buf, sz); memcpy(buf, buf1, sz1); memcpy(buf + sz1, buf2, sz2); - br = para_calloc(sizeof(*br)); + br = zalloc(sizeof(*br)); br->btrb = new_btrb(buf, sz); br->btrb->refcount = 1; br->consumed = 0; @@ -1067,13 +1067,13 @@ static int merge_input(struct btr_node *btrn) assert(i == 2); /* make a new btrb that combines the two buffers and a br to it. */ sz = szs[0] + szs[1]; - buf = para_malloc(sz); + buf = alloc(sz); PARA_DEBUG_LOG("%s: memory merging input buffers: (%zu, %zu) -> %zu\n", btrn->name, szs[0], szs[1], sz); memcpy(buf, bufs[0], szs[0]); memcpy(buf + szs[0], bufs[1], szs[1]); - br = para_calloc(sizeof(*br)); + br = zalloc(sizeof(*br)); br->btrb = new_btrb(buf, sz); br->btrb->refcount = 1; diff --git a/check_wav.c b/check_wav.c index 100975dc..3789f30a 100644 --- a/check_wav.c +++ b/check_wav.c @@ -207,7 +207,7 @@ struct check_wav_context *check_wav_init(struct btr_node *parent, struct btr_node *child, struct wav_params *params, struct btr_node **cw_btrn) { - struct check_wav_context *cwc = para_calloc(sizeof(*cwc)); + struct check_wav_context *cwc = zalloc(sizeof(*cwc)); cwc->state = CWS_NEED_HEADER; cwc->min_iqs = WAV_HEADER_LEN; diff --git a/chunk_queue.c b/chunk_queue.c index cf74cc33..1f11359f 100644 --- a/chunk_queue.c +++ b/chunk_queue.c @@ -52,7 +52,7 @@ int cq_enqueue(struct chunk_queue *cq, const char *buf, size_t num_bytes) if (cq->num_pending + num_bytes > cq->max_pending) return -E_QUEUE; - qc = para_malloc(sizeof(struct queued_chunk)); + qc = alloc(sizeof(struct queued_chunk)); cq->num_pending += num_bytes; qc->buf = buf; qc->num_bytes = num_bytes; @@ -130,7 +130,7 @@ int cq_get(struct queued_chunk *qc, const char **buf, size_t *num_bytes) */ struct chunk_queue *cq_new(size_t max_pending) { - struct chunk_queue *cq = para_malloc(sizeof(*cq)); + struct chunk_queue *cq = alloc(sizeof(*cq)); init_list_head(&cq->q); cq->max_pending = max_pending; cq->num_pending = 0; diff --git a/client.c b/client.c index 36e851f4..a6aee0f8 100644 --- a/client.c +++ b/client.c @@ -347,7 +347,7 @@ static void setatt_completer(struct i9e_completion_info *ci, if (ret < 0) goto out; num_atts = ret; - sl = para_realloc(sl, (2 * num_atts + 1) * sizeof(char *)); + sl = arr_realloc(sl, 2 * num_atts + 1, sizeof(char *)); for (i = 0; i < num_atts; i++) { char *orig = sl[i]; sl[i] = make_message("%s+", orig); @@ -441,7 +441,7 @@ static void select_completer(struct i9e_completion_info *ci, goto free_moods; num_pl = ret; n = num_moods + num_pl; - mops = para_malloc((n + 1) * sizeof(char *)); + mops = arr_alloc(n + 1, sizeof(char *)); for (i = 0; i < num_moods; i++) mops[i] = make_message("m/%s", moods[i]); for (i = 0; i < num_pl; i++) diff --git a/client_common.c b/client_common.c index 3beeed1f..f476a1c4 100644 --- a/client_common.c +++ b/client_common.c @@ -245,7 +245,7 @@ static int send_sb_command(struct client_task *ct) for (i = 0; i < num_inputs; i++) len += strlen(lls_input(i, ct->lpr)) + 1; - p = command = para_malloc(len); + p = command = alloc(len); for (i = 0; i < num_inputs; i++) { const char *str = lls_input(i, ct->lpr); strcpy(p, str); @@ -336,8 +336,7 @@ static int client_post_monitor(struct sched *s, void *context) free(sbb.iov.iov_base); if (ret < 0) goto out; - ct->challenge_hash = para_malloc(HASH2_SIZE); - + ct->challenge_hash = alloc(HASH2_SIZE); if (has_feature("sha256", ct)) { hash2_function((char *)crypt_buf, APC_CHALLENGE_SIZE, ct->challenge_hash); hash2_to_asc(ct->challenge_hash, buf); @@ -582,7 +581,7 @@ int client_parse_config(int argc, char *argv[], struct client_task **ct_ptr, PARA_INFO_LOG("user: %s\n", user); PARA_INFO_LOG("key file: %s\n", kf); PARA_INFO_LOG("loglevel: %d\n", ll); - ct = para_calloc(sizeof(*ct)); + ct = zalloc(sizeof(*ct)); ct->scc.fd = -1; ct->lpr = lpr; ct->key_file = kf; diff --git a/close_on_fork.c b/close_on_fork.c index 7b464d09..809f027e 100644 --- a/close_on_fork.c +++ b/close_on_fork.c @@ -31,7 +31,7 @@ struct close_on_fork { */ void add_close_on_fork_list(int fd) { - struct close_on_fork *cof = para_malloc(sizeof(struct close_on_fork)); + struct close_on_fork *cof = alloc(sizeof(struct close_on_fork)); if (!initialized) { init_list_head(&close_on_fork_list); diff --git a/command.c b/command.c index 0f47110e..a0102eeb 100644 --- a/command.c +++ b/command.c @@ -78,7 +78,7 @@ static char *vss_status_tohuman(unsigned int flags) */ static char *vss_get_status_flags(unsigned int flags) { - char *msg = para_malloc(5 * sizeof(char)); + char *msg = alloc(5 * sizeof(char)); msg[0] = (flags & VSS_PLAYING)? 'P' : '_'; msg[1] = (flags & VSS_NOMORE)? 'O' : '_'; @@ -871,7 +871,7 @@ static int run_command(struct command_context *cc, struct iovec *iov) for (i = 0; p < end; i++) p += strlen(p) + 1; argc = i; - argv = para_malloc((argc + 1) * sizeof(char *)); + argv = arr_alloc(argc + 1, sizeof(char *)); for (i = 0, p = iov->iov_base; p < end; i++) { argv[i] = para_strdup(p); p += strlen(p) + 1; @@ -926,7 +926,7 @@ int handle_connect(int fd) int ret; unsigned char rand_buf[APC_CHALLENGE_SIZE + 2 * SESSION_KEY_LEN]; unsigned char challenge_hash[HASH2_SIZE]; - char *command = NULL, *buf = para_malloc(HANDSHAKE_BUFSIZE) /* must be on the heap */; + char *command = NULL, *buf = alloc(HANDSHAKE_BUFSIZE) /* must be on the heap */; size_t numbytes; struct command_context cc_struct = {.u = NULL}, *cc = &cc_struct; struct iovec iov; diff --git a/compress_filter.c b/compress_filter.c index 9f9d8515..a6a00191 100644 --- a/compress_filter.c +++ b/compress_filter.c @@ -66,7 +66,7 @@ next_buffer: if (inplace) op = ip; else - op = para_malloc(length); + op = alloc(length); for (i = 0; i < length / 2; i++) { /* be careful in that heat, my dear */ int sample = *ip++; @@ -116,7 +116,7 @@ err: static void compress_open(struct filter_node *fn) { - struct private_compress_data *pcd = para_calloc(sizeof(*pcd)); + struct private_compress_data *pcd = zalloc(sizeof(*pcd)); uint32_t inertia = U32_OPTVAL(INERTIA, fn->lpr); uint32_t aggressiveness = U32_OPTVAL(AGGRESSIVENESS, fn->lpr); diff --git a/crypt_common.c b/crypt_common.c index 3a44dbdd..d7471235 100644 --- a/crypt_common.c +++ b/crypt_common.c @@ -317,7 +317,7 @@ int decode_private_key(const char *key_file, unsigned char **result, goto unmap; key_size = footer - begin; - key = para_malloc(key_size + 1); + key = alloc(key_size + 1); for (i = 0, j = 0; begin + i < footer; i++) { if (para_isspace(begin[i])) continue; diff --git a/dccp_recv.c b/dccp_recv.c index faacd39f..fe2f7abf 100644 --- a/dccp_recv.c +++ b/dccp_recv.c @@ -76,7 +76,7 @@ static int dccp_recv_open(struct receiver_node *rn) /* Copy CCID preference list (u8 array required) */ given = lls_opt_given(r_c); if (given) { - ccids = para_malloc(given); + ccids = alloc(given); fo = flowopt_new(); for (i = 0; i < given; i++) ccids[i] = lls_int32_val(i, r_c); diff --git a/dccp_send.c b/dccp_send.c index 9e937271..15a361ba 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -147,7 +147,7 @@ static void dccp_post_monitor(__a_unused struct sched *s) shutdown_client(sc, dss); return; } - dfc = para_calloc(sizeof(*dfc)); + dfc = zalloc(sizeof(*dfc)); sc->private_data = dfc; k = OPT_UINT32_VAL(DCCP_DATA_SLICES_PER_GROUP); n = OPT_UINT32_VAL(DCCP_SLICES_PER_GROUP); diff --git a/fd.c b/fd.c index 800106e1..763f756c 100644 --- a/fd.c +++ b/fd.c @@ -269,7 +269,7 @@ int read_nonblock(int fd, void *buf, size_t sz, size_t *num_bytes) int read_pattern(int fd, const char *pattern, size_t bufsize) { size_t n, len; - char *buf = para_malloc(bufsize + 1); + char *buf = alloc(bufsize + 1); int ret = read_nonblock(fd, buf, bufsize, &n); buf[n] = '\0'; diff --git a/fec.c b/fec.c index 2301cc8d..932e0693 100644 --- a/fec.c +++ b/fec.c @@ -97,7 +97,7 @@ static void init_mul_table(void) static unsigned char *alloc_matrix(int rows, int cols) { - return para_malloc(rows * cols); + return arr_alloc(rows, cols); } /* @@ -245,9 +245,9 @@ static void matmul(unsigned char *a, unsigned char *b, unsigned char *c, static int invert_mat(unsigned char *src, int k) { int irow, icol, row, col, ix, error; - int *indxc = para_malloc(k * sizeof(int)); - int *indxr = para_malloc(k * sizeof(int)); - int *ipiv = para_malloc(k * sizeof(int)); /* elements used as pivots */ + int *indxc = arr_alloc(k, sizeof(int)); + int *indxr = arr_alloc(k, sizeof(int)); + int *ipiv = arr_alloc(k, sizeof(int)); /* elements used as pivots */ unsigned char c, *p, *id_row = alloc_matrix(1, k), *temp_row = alloc_matrix(1, k); @@ -371,9 +371,9 @@ static void invert_vdm(unsigned char *src, int k) * c holds the coefficient of P(x) = Prod (x - p_i), i=0..k-1 * b holds the coefficient for the matrix inversion */ - c = para_malloc(k); - b = para_malloc(k); - p = para_malloc(k); + c = alloc(k); + b = alloc(k); + p = alloc(k); for (j = 1, i = 0; i < k; i++, j += k) { c[i] = 0; @@ -466,7 +466,7 @@ int fec_new(int k, int n, struct fec_parms **result) if (k < 1 || k > GF_SIZE + 1 || n > GF_SIZE + 1 || k > n) return -E_FEC_PARMS; - parms = para_malloc(sizeof(struct fec_parms)); + parms = alloc(sizeof(struct fec_parms)); parms->k = k; parms->n = n; parms->enc_matrix = alloc_matrix(n, k); @@ -607,10 +607,10 @@ int fec_decode(struct fec_parms *parms, unsigned char **data, int *idx, if (ret < 0) return ret; /* do the actual decoding */ - slice = para_malloc(k * sizeof(unsigned char *)); + slice = arr_alloc(k, sizeof(unsigned char *)); for (row = 0; row < k; row++) { if (idx[row] >= k) { - slice[row] = para_calloc(sz); + slice[row] = zalloc(sz); for (col = 0; col < k; col++) addmul(slice[row], data[col], m_dec[row * k + col], sz); diff --git a/fecdec_filter.c b/fecdec_filter.c index d629603c..1d8fbc16 100644 --- a/fecdec_filter.c +++ b/fecdec_filter.c @@ -225,8 +225,8 @@ static int add_slice(char *buf, struct fecdec_group *fg) } if (fg->num_slices == 0) { fg->num_slices = fg->h.slices_per_group; - fg->idx = para_malloc(fg->num_slices * sizeof(int)); - fg->data = para_calloc(fg->num_slices * sizeof(unsigned char *)); + fg->idx = arr_alloc(fg->num_slices, sizeof(int)); + fg->data = arr_zalloc(fg->num_slices, sizeof(unsigned char *)); } r = fg->num_received_slices; /* Check if we already have this slice. */ @@ -236,7 +236,7 @@ static int add_slice(char *buf, struct fecdec_group *fg) return 0; } fg->idx[r] = slice_num; - fg->data[r] = para_malloc(fg->h.slice_bytes); + fg->data[r] = alloc(fg->h.slice_bytes); memcpy(fg->data[r], buf, fg->h.slice_bytes); fg->num_received_slices++; return 1; @@ -471,7 +471,7 @@ out: static void fecdec_open(struct filter_node *fn) { struct private_fecdec_data *pfd; - pfd = para_calloc(sizeof(*pfd)); + pfd = zalloc(sizeof(*pfd)); fn->private_data = pfd; fn->min_iqs = FEC_HEADER_SIZE; } diff --git a/file_write.c b/file_write.c index 64153178..ba902070 100644 --- a/file_write.c +++ b/file_write.c @@ -64,7 +64,7 @@ static int prepare_output_file(struct writer_node *wn) close(fd); return ret; } - pfwd = wn->private_data = para_calloc(sizeof(*pfwd)); + pfwd = wn->private_data = zalloc(sizeof(*pfwd)); pfwd->fd = fd; return 1; } diff --git a/filter.c b/filter.c index 85d3da7e..722cb16f 100644 --- a/filter.c +++ b/filter.c @@ -120,14 +120,14 @@ int main(int argc, char *argv[]) EMBRACE(.name = "stdin")); stdin_task_register(sit, &s); - fns = para_malloc(OPT_GIVEN(FILTER) * sizeof(*fns)); + fns = arr_alloc(OPT_GIVEN(FILTER), sizeof(*fns)); for (i = 0, parent = sit->btrn; i < OPT_GIVEN(FILTER); i++) { const char *fa = lls_string_val(i, OPT_RESULT(FILTER)); const char *name; struct filter_node *fn; struct task_info ti; - fn = fns[i] = para_calloc(sizeof(*fn)); + fn = fns[i] = zalloc(sizeof(*fn)); fn->filter_num = filter_setup(fa, &fn->conf, &filter_lpr); name = filter_name(fn->filter_num); fn->lpr = filter_lpr; diff --git a/flac_afh.c b/flac_afh.c index 6e236839..2b5b6c1d 100644 --- a/flac_afh.c +++ b/flac_afh.c @@ -374,8 +374,8 @@ static int flac_afh_read_chunks(struct private_flac_afh_data *pfad) goto free_decoder; if (c >= chunk_table_size) { chunk_table_size = 2 * chunk_table_size + 100; - afhi->chunk_table = para_realloc(afhi->chunk_table, - chunk_table_size * sizeof(uint32_t)); + afhi->chunk_table = arr_realloc(afhi->chunk_table, + chunk_table_size, sizeof(uint32_t)); } afhi->chunk_table[c] = pos; @@ -481,7 +481,7 @@ static int flac_rewrite_tags(const char *map, size_t map_bytes, FLAC__Metadata_Iterator *iter; FLAC__StreamMetadata *b = NULL; FLAC__bool ok; - struct private_flac_afh_data *pfad = para_calloc(sizeof(*pfad)); + struct private_flac_afh_data *pfad = zalloc(sizeof(*pfad)); pfad->map = map; pfad->map_bytes = map_bytes; diff --git a/flacdec_filter.c b/flacdec_filter.c index 2c9f8607..f3060f57 100644 --- a/flacdec_filter.c +++ b/flacdec_filter.c @@ -135,7 +135,7 @@ static FLAC__StreamDecoderWriteStatus write_cb( struct btr_node *btrn = fn->btrn; size_t k, n = frame->header.blocksize; unsigned channels = FLAC__stream_decoder_get_channels(decoder); - char *outbuffer = para_malloc(n * channels * 2); + char *outbuffer = arr_alloc(n, channels * 2); if (channels == 1) { for (k = 0; k < n; k++) { @@ -286,7 +286,7 @@ static void flacdec_close(struct filter_node *fn) static void flacdec_open(struct filter_node *fn) { - struct private_flacdec_data *pfd = para_calloc(sizeof(*pfd)); + struct private_flacdec_data *pfd = zalloc(sizeof(*pfd)); fn->private_data = pfd; fn->min_iqs = 0; } diff --git a/gcrypt.c b/gcrypt.c index 506f0bb8..763fa6de 100644 --- a/gcrypt.c +++ b/gcrypt.c @@ -406,7 +406,7 @@ static int get_private_key(const char *key_file, struct asymmetric_key **result) ret = -E_SEXP_BUILD; goto free_params; } - key = para_malloc(sizeof(*key)); + key = alloc(sizeof(*key)); key->sexp = sexp; *result = key; ret = bits; @@ -456,7 +456,7 @@ int apc_get_pubkey(const char *key_file, struct asymmetric_key **result) goto release_n; } PARA_INFO_LOG("successfully read %u bit ssh public key\n", bits); - key = para_malloc(sizeof(*key)); + key = alloc(sizeof(*key)); key->num_bytes = ret; key->sexp = sexp; *result = key; @@ -624,7 +624,7 @@ struct stream_cipher { struct stream_cipher *sc_new(const unsigned char *data, int len) { gcry_error_t gret; - struct stream_cipher *sc = para_malloc(sizeof(*sc)); + struct stream_cipher *sc = alloc(sizeof(*sc)); assert(len >= 2 * AES_CRT128_BLOCK_SIZE); gret = gcry_cipher_open(&sc->handle, GCRY_CIPHER_AES128, diff --git a/grab_client.c b/grab_client.c index 393e2ce3..1019e579 100644 --- a/grab_client.c +++ b/grab_client.c @@ -261,7 +261,7 @@ static int gc_check_args(struct lls_parse_result *lpr, struct grab_client *gc) int grab_client_new(int fd, struct lls_parse_result *lpr, struct sched *s) { int ret; - struct grab_client *gc = para_calloc(sizeof(struct grab_client)); + struct grab_client *gc = zalloc(sizeof(struct grab_client)); ret = gc_check_args(lpr, gc); if (ret < 0) diff --git a/gui.c b/gui.c index 72908f23..ebfab356 100644 --- a/gui.c +++ b/gui.c @@ -431,7 +431,7 @@ static void rb_add_entry(int color, char *msg) if (strwidth(msg, &len) < 0) return; - new = para_malloc(sizeof(struct rb_entry)); + new = alloc(sizeof(struct rb_entry)); new->color = color; new->len = len; new->msg = msg; diff --git a/http_recv.c b/http_recv.c index 59e9696b..5aafacb8 100644 --- a/http_recv.c +++ b/http_recv.c @@ -160,7 +160,7 @@ static int http_recv_open(struct receiver_node *rn) close(fd); return ret; } - rn->private_data = phd = para_calloc(sizeof(struct private_http_recv_data)); + rn->private_data = phd = zalloc(sizeof(struct private_http_recv_data)); rn->fd = fd; phd->status = HTTP_CONNECTED; rn->btrp = btr_pool_new("http_recv", 320 * 1024); diff --git a/http_send.c b/http_send.c index 0a90e884..90e3ee57 100644 --- a/http_send.c +++ b/http_send.c @@ -191,7 +191,7 @@ static void http_post_monitor(__a_unused struct sched *s) sc = accept_sender_client(hss); if (!sc) return; - phsd = para_malloc(sizeof(*phsd)); + phsd = alloc(sizeof(*phsd)); sc->private_data = phsd; phsd->status = HTTP_CONNECTED; } diff --git a/imdct.c b/imdct.c index 93577b54..2e1089f1 100644 --- a/imdct.c +++ b/imdct.c @@ -336,7 +336,7 @@ static int fft_init(struct fft_context *s, int nbits) s->nbits = nbits; n = 1 << nbits; - s->revtab = para_malloc(n * sizeof(uint16_t)); + s->revtab = arr_alloc(n, sizeof(uint16_t)); for (j = 4; j <= nbits; j++) { int k = 1 << j; double freq = 2 * M_PI / k; @@ -366,13 +366,13 @@ int imdct_init(int nbits, struct mdct_context **result) double alpha; struct mdct_context *s; - s = para_calloc(sizeof(*s)); + s = zalloc(sizeof(*s)); n = 1 << nbits; s->nbits = nbits; s->n = n; n4 = n >> 2; - s->tcos = para_malloc(n4 * sizeof(fftsample_t)); - s->tsin = para_malloc(n4 * sizeof(fftsample_t)); + s->tcos = arr_alloc(n4, sizeof(fftsample_t)); + s->tsin = arr_alloc(n4, sizeof(fftsample_t)); for (i = 0; i < n4; i++) { alpha = 2 * M_PI * (i + 1.0 / 8.0) / n; diff --git a/interactive.c b/interactive.c index 6c9110fd..e367a659 100644 --- a/interactive.c +++ b/interactive.c @@ -634,7 +634,7 @@ int i9e_poll(struct pollfd *fds, nfds_t nfds, int timeout) int i9e_extract_completions(const char *word, char **string_list, char ***result) { - char **matches = para_malloc(sizeof(char *)); + char **matches = alloc(sizeof(char *)); int match_count = 0, matches_len = 1; char **p; int len = strlen(word); @@ -645,8 +645,8 @@ int i9e_extract_completions(const char *word, char **string_list, match_count++; if (match_count >= matches_len) { matches_len *= 2; - matches = para_realloc(matches, - matches_len * sizeof(char *)); + matches = arr_realloc(matches, matches_len, + sizeof(char *)); } matches[match_count - 1] = para_strdup(*p); } @@ -682,7 +682,7 @@ char **i9e_complete_commands(const char *word, struct i9e_completer *completers) if (is_prefix(word, cmd, len)) match_count++; } - matches = para_malloc((match_count + 1) * sizeof(*matches)); + matches = arr_alloc(match_count + 1, sizeof(*matches)); for (i = 0, match_count = 0; (cmd = completers[i].name); i++) if (is_prefix(word, cmd, len)) matches[match_count++] = para_strdup(cmd); @@ -766,7 +766,7 @@ int i9e_print_completions(struct i9e_completer *completers) if (*p == ' ') p++; n = end - p + 1; - ci.word = para_malloc(n + 1); + ci.word = alloc(n + 1); strncpy(ci.word, p, n); ci.word[n] = '\0'; create_matches: diff --git a/mood.c b/mood.c index b3f007b6..bcc9bc57 100644 --- a/mood.c +++ b/mood.c @@ -138,7 +138,7 @@ static void destroy_mood(struct mood *m) static struct mood *alloc_new_mood(const char *name) { - struct mood *m = para_calloc(sizeof(struct mood)); + struct mood *m = zalloc(sizeof(struct mood)); if (name) m->name = para_strdup(name); return m; @@ -363,8 +363,8 @@ static int add_if_admissible(struct osl_row *aft_row, void *data) if (statistics.num >= aa->size) { aa->size *= 2; aa->size += 100; - aa->array = para_realloc(aa->array, - aa->size * sizeof(struct osl_row *)); + aa->array = arr_realloc(aa->array, aa->size, + sizeof(struct osl_row *)); } aa->array[statistics.num] = aft_row; return add_afs_statistics(aft_row); diff --git a/mp.c b/mp.c index c537e729..fb5a0c07 100644 --- a/mp.c +++ b/mp.c @@ -90,7 +90,7 @@ unsigned parse_quoted_string(const char *src, const char quote_chars[2], assert(len >= 2); assert(src[0] == quote_chars[0]); - p = dst = para_malloc(len - 1); + p = dst = alloc(len - 1); backslash = false; for (n = 1;; n++) { char c; @@ -518,7 +518,7 @@ int mp_init(const char *definition, int nbytes, struct mp_context **result, *errmsg = NULL; return 0; } - ctx = para_calloc(sizeof(*ctx)); + ctx = zalloc(sizeof(*ctx)); ctx->errmsg = NULL; ctx->ast = NULL; diff --git a/mp3_afh.c b/mp3_afh.c index 728b25b8..d7493ac0 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -348,7 +348,7 @@ static int mp3_rewrite_tags(const char *map, size_t mapsize, if (ret < 0) goto out; new_v2size = id3_tag_render(v2_tag, NULL); - v2_buffer = para_malloc(new_v2size); + v2_buffer = alloc(new_v2size); id3_tag_render(v2_tag, v2_buffer); PARA_INFO_LOG("writing v2 tag (%lu bytes)\n", new_v2size); ret = write_all(fd, (char *)v2_buffer, new_v2size); @@ -598,7 +598,7 @@ static int mp3_read_info(unsigned char *map, size_t numbytes, int fd, const char *tag_versions[] = {"no", "id3v1", "id3v2", "id3v1+id3v2"}; afhi->chunks_total = 0; - afhi->chunk_table = para_malloc(chunk_table_size * sizeof(uint32_t)); + afhi->chunk_table = arr_alloc(chunk_table_size, sizeof(uint32_t)); while (1) { int freq, br; struct timeval tmp, cct; /* current chunk time */ @@ -633,8 +633,8 @@ static int mp3_read_info(unsigned char *map, size_t numbytes, int fd, total_time = tmp; if (afhi->chunks_total >= chunk_table_size) { chunk_table_size *= 2; - afhi->chunk_table = para_realloc(afhi->chunk_table, - chunk_table_size * sizeof(uint32_t)); + afhi->chunk_table = arr_realloc(afhi->chunk_table, + chunk_table_size, sizeof(uint32_t)); } afhi->chunk_table[afhi->chunks_total] = fpos; afhi->chunks_total++; diff --git a/mp3dec_filter.c b/mp3dec_filter.c index 6a196f3a..bc8ccdaa 100644 --- a/mp3dec_filter.c +++ b/mp3dec_filter.c @@ -144,7 +144,7 @@ decode: } fn->min_iqs = 0; mad_synth_frame(&pmd->synth, &pmd->frame); - outbuffer = para_malloc(pmd->synth.pcm.length * 2 * pmd->channels); + outbuffer = arr_alloc(pmd->synth.pcm.length, 2 * pmd->channels); loaded = 0; for (i = 0; i < pmd->synth.pcm.length; i++) { int sample = MAD_TO_SHORT(pmd->synth.pcm.samples[0][i]); @@ -166,7 +166,7 @@ err: static void mp3dec_open(struct filter_node *fn) { - struct private_mp3dec_data *pmd = para_calloc(sizeof(*pmd)); + struct private_mp3dec_data *pmd = zalloc(sizeof(*pmd)); fn->private_data = pmd; mad_stream_init(&pmd->stream); diff --git a/mp4.c b/mp4.c index 4b8607b1..f8515ca2 100644 --- a/mp4.c +++ b/mp4.c @@ -240,7 +240,7 @@ static int read_stsz(struct mp4 *f) return ret; if (t->stsz_sample_size != 0) return 1; - t->stsz_table = para_malloc(t->stsz_sample_count * sizeof(int32_t)); + t->stsz_table = arr_alloc(t->stsz_sample_count, sizeof(int32_t)); for (uint32_t n = 0; n < t->stsz_sample_count; n++) { ret = read_int32(f, &t->stsz_table[n]); if (ret <= 0) @@ -260,8 +260,7 @@ static int read_stts(struct mp4 *f) ret = read_int32(f, &t->stts_entry_count); if (ret <= 0) return ret; - t->stts_sample_count = para_malloc(t->stts_entry_count - * sizeof(int32_t)); + t->stts_sample_count = arr_alloc(t->stts_entry_count, sizeof(int32_t)); for (uint32_t n = 0; n < t->stts_entry_count; n++) { ret = read_int32(f, &t->stts_sample_count[n]); if (ret <= 0) @@ -284,9 +283,9 @@ static int read_stsc(struct mp4 *f) ret = read_int32(f, &t->stsc_entry_count); if (ret <= 0) return ret; - t->stsc_first_chunk = para_malloc(t->stsc_entry_count * sizeof(int32_t)); - t->stsc_samples_per_chunk = para_malloc(t->stsc_entry_count - * sizeof (int32_t)); + t->stsc_first_chunk = arr_alloc(t->stsc_entry_count, sizeof(int32_t)); + t->stsc_samples_per_chunk = arr_alloc(t->stsc_entry_count, + sizeof (int32_t)); for (uint32_t n = 0; n < t->stsc_entry_count; n++) { ret = read_int32(f, &t->stsc_first_chunk[n]); if (ret <= 0) @@ -310,8 +309,7 @@ static int read_stco(struct mp4 *f) ret = read_int32(f, &t->stco_entry_count); if (ret <= 0) return ret; - t->stco_chunk_offset = para_malloc(t->stco_entry_count - * sizeof(int32_t)); + t->stco_chunk_offset = arr_alloc(t->stco_entry_count, sizeof(int32_t)); for (uint32_t n = 0; n < t->stco_entry_count; n++) { ret = read_int32(f, &t->stco_chunk_offset[n]); if (ret <= 0) @@ -396,7 +394,7 @@ static int parse_tag(struct mp4 *f, uint8_t parent, int32_t size) goto fail; len = subsize - (header_size + 8); free(value); - value = para_malloc(len + 1); + value = alloc(len + 1); ret = read_data(f, value, len); if (ret <= 0) goto fail; @@ -609,7 +607,7 @@ static int open_file(const struct mp4_callback *cb, bool meta_only, struct mp4 * int ret; uint64_t size; uint8_t atom_type, header_size; - struct mp4 *f = para_calloc(sizeof(*f)); + struct mp4 *f = zalloc(sizeof(*f)); f->cb = cb; while ((ret = atom_read_header(f, &atom_type, &header_size, &size)) > 0) { @@ -918,7 +916,7 @@ static void *modify_moov(struct mp4 *f, uint32_t *out_size) new_ilst_size += TAG_LEN(strlen(f->meta.tags[n].value)); size_delta = new_ilst_size - (f->ilst_size - 8); *out_size = total_size + size_delta; - out_buffer = para_malloc(*out_size); + out_buffer = alloc(*out_size); p_out = out_buffer; set_position(f, total_base); ret = read_data(f, p_out, f->udta_offset - total_base); diff --git a/net.c b/net.c index 4a6f9a63..e01af24b 100644 --- a/net.c +++ b/net.c @@ -286,7 +286,7 @@ struct flowopts { */ struct flowopts *flowopt_new(void) { - struct flowopts *new = para_malloc(sizeof(*new)); + struct flowopts *new = alloc(sizeof(*new)); init_list_head(&new->sockopts); return new; @@ -307,7 +307,7 @@ struct flowopts *flowopt_new(void) void flowopt_add(struct flowopts *fo, int lev, int opt, const char *name, const void *val, int len) { - struct pre_conn_opt *new = para_malloc(sizeof(*new)); + struct pre_conn_opt *new = alloc(sizeof(*new)); new->sock_option = opt; new->sock_level = lev; @@ -317,7 +317,7 @@ void flowopt_add(struct flowopts *fo, int lev, int opt, new->opt_val = NULL; new->opt_len = 0; } else { - new->opt_val = para_malloc(len); + new->opt_val = alloc(len); new->opt_len = len; memcpy(new->opt_val, val, len); } diff --git a/ogg_afh_common.c b/ogg_afh_common.c index 3e36bdd5..3a5c263c 100644 --- a/ogg_afh_common.c +++ b/ogg_afh_common.c @@ -167,7 +167,7 @@ int oac_get_file_info(char *map, size_t numbytes, struct afh_info *afhi, PARA_INFO_LOG("%" PRIu32 " seconds, %d frames/chunk\n", afhi->seconds_total, frames_per_chunk); ct_size = 250; - afhi->chunk_table = para_malloc(ct_size * sizeof(uint32_t)); + afhi->chunk_table = arr_alloc(ct_size, sizeof(uint32_t)); afhi->chunk_table[0] = 0; afhi->chunk_table[1] = afhi->header_len; oss.returned = afhi->header_len; @@ -179,9 +179,9 @@ int oac_get_file_info(char *map, size_t numbytes, struct afh_info *afhi, j++; if (j >= ct_size) { ct_size *= 2; - afhi->chunk_table = para_realloc( + afhi->chunk_table = arr_realloc( afhi->chunk_table, - ct_size * sizeof(uint32_t)); + ct_size, sizeof(uint32_t)); } afhi->chunk_table[j] = oss.returned; } @@ -367,7 +367,7 @@ struct oac_custom_header { */ struct oac_custom_header *oac_custom_header_new(void) { - return para_calloc(sizeof(struct oac_custom_header)); + return zalloc(sizeof(struct oac_custom_header)); } /** diff --git a/oggdec_filter.c b/oggdec_filter.c index a6fa056a..da70d4c0 100644 --- a/oggdec_filter.c +++ b/oggdec_filter.c @@ -88,7 +88,7 @@ static const ov_callbacks ovc = { static void ogg_open(struct filter_node *fn) { - fn->private_data = para_calloc(sizeof(struct private_oggdec_data)); + fn->private_data = zalloc(sizeof(struct private_oggdec_data)); fn->min_iqs = 8000; } @@ -121,7 +121,7 @@ static int ogg_init(struct filter_node *fn) struct btr_node *btrn = fn->btrn; int ret, oret; size_t iqs; - struct OggVorbis_File *vf = para_malloc(sizeof(*vf)); + struct OggVorbis_File *vf = alloc(sizeof(*vf)); PARA_NOTICE_LOG("iqs: %zu, min_iqs: %zu, opening ov callbacks\n", btr_get_input_queue_size(btrn), fn->min_iqs); @@ -228,7 +228,7 @@ static int ogg_post_monitor(__a_unused struct sched *s, void *context) goto out; } have = 0; - buf = para_malloc(OGGDEC_OUTPUT_CHUNK_SIZE); + buf = alloc(OGGDEC_OUTPUT_CHUNK_SIZE); for (;;) { ret = ov_read(pod->vf, buf + have, OGGDEC_OUTPUT_CHUNK_SIZE - have, ENDIAN, 2 /* 16 bit */, 1 /* signed */, NULL); diff --git a/openssl.c b/openssl.c index 32891cbb..9d3ad577 100644 --- a/openssl.c +++ b/openssl.c @@ -283,7 +283,7 @@ int apc_get_pubkey(const char *key_file, struct asymmetric_key **result) unsigned char *blob; size_t decoded_size; int ret; - struct asymmetric_key *key = para_malloc(sizeof(*key)); + struct asymmetric_key *key = alloc(sizeof(*key)); ret = decode_public_key(key_file, &blob, &decoded_size); if (ret < 0) @@ -324,7 +324,7 @@ int apc_priv_decrypt(const char *key_file, unsigned char *outbuf, return ret; if (inlen < 0) return -E_RSA; - priv = para_malloc(sizeof(*priv)); + priv = alloc(sizeof(*priv)); ret = get_private_key(key_file, &priv->rsa); if (ret < 0) { free(priv); @@ -366,7 +366,7 @@ struct stream_cipher { struct stream_cipher *sc_new(const unsigned char *data, int len) { - struct stream_cipher *sc = para_malloc(sizeof(*sc)); + struct stream_cipher *sc = alloc(sizeof(*sc)); assert(len >= 2 * AES_CRT128_BLOCK_SIZE); sc->aes = EVP_CIPHER_CTX_new(); @@ -390,7 +390,7 @@ static void aes_ctr128_crypt(EVP_CIPHER_CTX *ctx, struct iovec *src, *dst = (typeof(*dst)) { /* Add one for the terminating zero byte. */ - .iov_base = para_malloc(inlen + 1), + .iov_base = alloc(inlen + 1), .iov_len = inlen }; ret = EVP_EncryptUpdate(ctx, dst->iov_base, &outlen, src->iov_base, inlen); diff --git a/opus_afh.c b/opus_afh.c index dca6cfba..0a291bb1 100644 --- a/opus_afh.c +++ b/opus_afh.c @@ -179,7 +179,7 @@ static size_t opus_make_meta_packet(struct taginfo *tags, char **result) } PARA_DEBUG_LOG("meta packet size: %zu bytes\n", sz); /* terminating zero byte for the last sprintf() */ - buf = p = para_malloc(sz + 1); + buf = p = alloc(sz + 1); memcpy(p, OPUS_COMMENT_HEADER, strlen(OPUS_COMMENT_HEADER)); p += strlen(OPUS_COMMENT_HEADER); write_u32(p, comment_sz); diff --git a/opusdec_filter.c b/opusdec_filter.c index 31f9640b..85287be0 100644 --- a/opusdec_filter.c +++ b/opusdec_filter.c @@ -86,7 +86,7 @@ static int opusdec_execute(struct btr_node *btrn, const char *cmd, static void opusdec_open(struct filter_node *fn) { - struct opusdec_context *ctx = para_calloc(sizeof(*ctx)); + struct opusdec_context *ctx = zalloc(sizeof(*ctx)); ogg_sync_init(&ctx->oy); fn->private_data = ctx; @@ -153,7 +153,7 @@ static void opusdec_add_output(short *pcm, int frames_available, if (tmp_skip > 0) { short *in = pcm + ctx->channels * tmp_skip; - short *out = para_malloc(bytes); + short *out = alloc(bytes); memcpy(out, in, bytes); free(pcm); pcm = out; @@ -193,7 +193,7 @@ static int decode_packet(struct opusdec_context *ctx, ogg_packet *op, /* don't care for anything except opus eos */ if (op->e_o_s && ctx->os.serialno == ctx->opus_serialno) ctx->eos = true; - output = para_malloc(sizeof(short) * MAX_FRAME_SIZE * ctx->channels); + output = arr_alloc(sizeof(short) * ctx->channels, MAX_FRAME_SIZE); ret = opus_multistream_decode(ctx->st, (unsigned char *)op->packet, op->bytes, output, MAX_FRAME_SIZE, 0); if (ret < 0) { diff --git a/oss_mix.c b/oss_mix.c index f80301e9..0814336f 100644 --- a/oss_mix.c +++ b/oss_mix.c @@ -56,7 +56,7 @@ static int oss_mix_open(const char *dev, struct mixer_handle **handle) PARA_ERROR_LOG("could not open %s\n", dev); return ret; } - h = para_malloc(sizeof(*h)); + h = alloc(sizeof(*h)); h->fd = ret; *handle = h; return 1; diff --git a/oss_write.c b/oss_write.c index 1a837e57..96d7b187 100644 --- a/oss_write.c +++ b/oss_write.c @@ -101,7 +101,7 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate, { int ret, format; unsigned ch, rate; - struct private_oss_write_data *powd = para_calloc(sizeof(*powd)); + struct private_oss_write_data *powd = zalloc(sizeof(*powd)); const char *dev = WRITE_CMD_OPT_STRING_VAL(OSS, DEVICE, wn->lpr); PARA_INFO_LOG("opening %s\n", dev); diff --git a/para.h b/para.h index 2525bee6..bbf91330 100644 --- a/para.h +++ b/para.h @@ -46,7 +46,6 @@ typeof(x) _x = (x); \ _x > 0? _x : -_x; }) - extern __printf_2_3 void (*para_log)(int, const char*, ...); /** * Define a standard log function that always writes to stderr. diff --git a/play.c b/play.c index 66383ebe..b6055724 100644 --- a/play.c +++ b/play.c @@ -288,7 +288,7 @@ static int shuffle_compare(__a_unused const void *a, __a_unused const void *b) static void init_shuffle_map(void) { unsigned n, num_inputs = lls_num_inputs(play_lpr); - shuffle_map = para_malloc(num_inputs * sizeof(unsigned)); + shuffle_map = arr_alloc(num_inputs, sizeof(unsigned)); for (n = 0; n < num_inputs; n++) shuffle_map[n] = n; if (!OPT_GIVEN(RANDOMIZE)) @@ -591,7 +591,7 @@ static char *get_user_key_map_seq(int key) if (!p) return NULL; len = p - kma; - result = para_malloc(len + 1); + result = alloc(len + 1); memcpy(result, kma, len); result[len] = '\0'; return result; @@ -611,7 +611,7 @@ static char *get_key_map_seq_safe(int key) if (len == 1 && isprint(*seq)) return seq; - sseq = para_malloc(2 + 2 * len + 1); + sseq = alloc(2 + 2 * len + 1); sseq[0] = '0'; sseq[1] = 'x'; for (n = 0; n < len; n++) { @@ -651,7 +651,7 @@ static char **get_mapped_keyseqs(void) char **result; int i; - result = para_malloc((NUM_MAPPED_KEYS + 1) * sizeof(char *)); + result = arr_alloc(NUM_MAPPED_KEYS + 1, sizeof(char *)); FOR_EACH_MAPPED_KEY(i) { char *seq = get_key_map_seq(i); result[i] = seq; @@ -1260,7 +1260,7 @@ int main(int argc, char *argv[]) session_open(); num_inputs = lls_num_inputs(play_lpr); init_shuffle_map(); - pt->invalid = para_calloc(sizeof(*pt->invalid) * num_inputs); + pt->invalid = arr_zalloc(num_inputs, sizeof(*pt->invalid)); pt->rq = CRT_FILE_CHANGE; pt->playing = true; pt->task = task_register(&(struct task_info){ diff --git a/prebuffer_filter.c b/prebuffer_filter.c index 031aa47e..28b71010 100644 --- a/prebuffer_filter.c +++ b/prebuffer_filter.c @@ -80,7 +80,7 @@ fail: static void prebuffer_open(struct filter_node *fn) { - struct private_prebuffer_data *ppd = para_calloc(sizeof(*ppd)); + struct private_prebuffer_data *ppd = zalloc(sizeof(*ppd)); fn->private_data = ppd; } diff --git a/recv_common.c b/recv_common.c index ad34991c..1939300a 100644 --- a/recv_common.c +++ b/recv_common.c @@ -41,7 +41,7 @@ int check_receiver_arg(const char *ra, struct lls_parse_result **lprp) *lprp = NULL; if (!ra || !*ra) { argc = 1; - argv = para_malloc(2 * sizeof(char*)); + argv = alloc(2 * sizeof(char*)); argv[0] = para_strdup("http"); argv[1] = NULL; } else { diff --git a/resample_filter.c b/resample_filter.c index 01b4ac48..bf28e975 100644 --- a/resample_filter.c +++ b/resample_filter.c @@ -51,7 +51,7 @@ static void resample_close(struct filter_node *fn) static void resample_open(struct filter_node *fn) { - struct resample_context *ctx = para_calloc(sizeof(*ctx)); + struct resample_context *ctx = zalloc(sizeof(*ctx)); struct btr_node *btrn = fn->btrn; struct wav_params wp; @@ -167,10 +167,10 @@ static int resample_frames(int16_t *in, size_t num_frames, bool have_more, data.output_frames = num_frames * ctx->ratio + 1; out_samples = data.output_frames * ctx->channels; - in_float = para_malloc(num_samples * sizeof(float)); + in_float = arr_alloc(num_samples, sizeof(float)); src_short_to_float_array(in, in_float, num_samples); data.data_in = in_float; - data.data_out = para_malloc(out_samples * sizeof(float)); + data.data_out = arr_alloc(out_samples, sizeof(float)); ret = src_process(ctx->src_state, &data); free(in_float); if (ret != 0) { @@ -179,7 +179,7 @@ static int resample_frames(int16_t *in, size_t num_frames, bool have_more, return -E_LIBSAMPLERATE; } out_samples = data.output_frames_gen * ctx->channels; - out = para_malloc(out_samples * sizeof(short)); + out = arr_alloc(out_samples, sizeof(short)); src_float_to_short_array(data.data_out, out, out_samples); free(data.data_out); *result = out; diff --git a/ringbuffer.c b/ringbuffer.c index 76e2d7af..0e706f0f 100644 --- a/ringbuffer.c +++ b/ringbuffer.c @@ -41,8 +41,8 @@ struct ringbuffer */ struct ringbuffer *ringbuffer_new(unsigned size) { - struct ringbuffer *rb = para_calloc(sizeof(struct ringbuffer)); - rb->entries = para_calloc(size * sizeof(void *)); + struct ringbuffer *rb = zalloc(sizeof(struct ringbuffer)); + rb->entries = zalloc(size * sizeof(void *)); rb->size = size; return rb; } diff --git a/sched.c b/sched.c index eb8d03c2..c786c9f2 100644 --- a/sched.c +++ b/sched.c @@ -230,7 +230,7 @@ void sched_shutdown(struct sched *s) */ struct task *task_register(struct task_info *info, struct sched *s) { - struct task *t = para_malloc(sizeof(*t)); + struct task *t = alloc(sizeof(*t)); assert(info->post_monitor); diff --git a/score.c b/score.c index 894e8ca3..54af56f7 100644 --- a/score.c +++ b/score.c @@ -119,7 +119,7 @@ int score_add(const struct osl_row *aft_row, long score) score_objs[SCORECOL_AFT_ROW].size = size; size = score_table_desc.column_descriptions[SCORECOL_SCORE].data_size; - score_objs[SCORECOL_SCORE].data = para_malloc(size); + score_objs[SCORECOL_SCORE].data = alloc(size); score_objs[SCORECOL_SCORE].size = size; *(long *)(score_objs[SCORECOL_SCORE].data) = score; @@ -176,7 +176,7 @@ int score_update(const struct osl_row *aft_row, long percent) return ret; new_score--; obj.size = sizeof(long); - obj.data = para_malloc(obj.size); + obj.data = alloc(obj.size); *(long *)obj.data = new_score; PARA_DEBUG_LOG("new score: %ld, rank %u/%u\n", new_score, new_pos, n); return osl(osl_update_object(score_table, row, SCORECOL_SCORE, &obj)); diff --git a/send_common.c b/send_common.c index ce167542..26502cab 100644 --- a/send_common.c +++ b/send_common.c @@ -120,14 +120,14 @@ void init_sender_status(struct sender_status *ss, if (n == 0) { ss->num_listen_fds = 1; - ss->listen_addresses = para_malloc(sizeof(char *)); + ss->listen_addresses = alloc(sizeof(char *)); ss->listen_addresses[0] = NULL; - ss->listen_fds = para_malloc(sizeof(int)); + ss->listen_fds = alloc(sizeof(int)); ss->listen_fds[0] = -1; } else { ss->num_listen_fds = n; - ss->listen_addresses = para_malloc(n * sizeof(char *)); - ss->listen_fds = para_malloc(n * sizeof(int)); + ss->listen_addresses = alloc(n * sizeof(char *)); + ss->listen_fds = alloc(n * sizeof(int)); FOR_EACH_LISTEN_FD(i, ss) { ss->listen_addresses[i] = para_strdup(lls_string_val(i, listen_address_opt_result)); @@ -390,7 +390,7 @@ struct sender_client *accept_sender_client(struct sender_status *ss) if (ret < 0) goto close_fd_and_warn; ss->num_clients++; - sc = para_calloc(sizeof(*sc)); + sc = zalloc(sizeof(*sc)); sc->fd = fd; sc->name = para_strdup(remote_name(fd)); sc->cq = cq_new(MAX_CQ_BYTES); diff --git a/server.c b/server.c index 2852ee1f..ea9cc9c0 100644 --- a/server.c +++ b/server.c @@ -436,14 +436,14 @@ static void init_server_command_task(struct server_command_task *sct, sct->argv = argv; if (!OPT_GIVEN(LISTEN_ADDRESS)) { sct->num_listen_fds = 1; - sct->listen_fds = para_malloc(sizeof(int)); + sct->listen_fds = alloc(sizeof(int)); ret = para_listen_simple(IPPROTO_TCP, port); if (ret < 0) goto err; sct->listen_fds[0] = ret; } else { sct->num_listen_fds = OPT_GIVEN(LISTEN_ADDRESS); - sct->listen_fds = para_malloc(sct->num_listen_fds * sizeof(int)); + sct->listen_fds = alloc(sct->num_listen_fds * sizeof(int)); for (n = 0; n < OPT_GIVEN(LISTEN_ADDRESS); n++) { const char *arg; arg = lls_string_val(n, OPT_RESULT(LISTEN_ADDRESS)); diff --git a/sideband.c b/sideband.c index ed7867a1..d4876234 100644 --- a/sideband.c +++ b/sideband.c @@ -37,7 +37,7 @@ struct sb_context { struct sb_context *sb_new_recv(size_t max_size, sb_transformation t, void *trafo_context) { - struct sb_context *c = para_calloc(sizeof(*c)); + struct sb_context *c = zalloc(sizeof(*c)); c->max_size = max_size; c->trafo = t; @@ -62,7 +62,7 @@ struct sb_context *sb_new_recv(size_t max_size, sb_transformation t, struct sb_context *sb_new_send(struct sb_buffer *sbb, bool dont_free, sb_transformation t, void *trafo_context) { - struct sb_context *c = para_calloc(sizeof(*c)); + struct sb_context *c = zalloc(sizeof(*c)); struct iovec src, dst, *srcp, *dstp; assert(sbb); @@ -266,7 +266,7 @@ int sb_received(struct sb_context *c, size_t nbytes, struct sb_buffer *result) */ if (sbb->iov.iov_len == (size_t)-1) return -E_SB_PACKET_SIZE; - sbb->iov.iov_base = para_malloc(sbb->iov.iov_len + 1); + sbb->iov.iov_base = alloc(sbb->iov.iov_len + 1); return 0; /* ready to read body */ success: *result = c->sbb; diff --git a/signal.c b/signal.c index e5ef7a41..bdafeaf2 100644 --- a/signal.c +++ b/signal.c @@ -48,7 +48,7 @@ struct signal_task *signal_init_or_die(void) ret = mark_fd_nonblocking(signal_pipe[1]); if (ret < 0) goto err_out; - st = para_calloc(sizeof(*st)); + st = zalloc(sizeof(*st)); st->fd = signal_pipe[0]; return st; err_out: diff --git a/spx_afh.c b/spx_afh.c index caeacb19..cd3b7cde 100644 --- a/spx_afh.c +++ b/spx_afh.c @@ -195,7 +195,7 @@ static size_t spx_make_meta_packet(struct taginfo *tags, char **result) } PARA_DEBUG_LOG("meta packet size: %zu bytes\n", sz); /* terminating zero byte for the last sprintf() */ - buf = p = para_malloc(sz + 1); + buf = p = alloc(sz + 1); write_u32(p, comment_sz); p += 4; strcpy(p, tags->comment); diff --git a/spxdec_filter.c b/spxdec_filter.c index 94a9c788..08eac02a 100644 --- a/spxdec_filter.c +++ b/spxdec_filter.c @@ -81,7 +81,7 @@ struct private_spxdec_data { static void spxdec_open(struct filter_node *fn) { - struct private_spxdec_data *psd = para_calloc(sizeof(*psd)); + struct private_spxdec_data *psd = zalloc(sizeof(*psd)); fn->private_data = psd; fn->min_iqs = 200; @@ -171,7 +171,7 @@ static int speexdec_write_frames(int packet_no, if (new_frame_size <= 0) continue; samples = new_frame_size * psd->shi.channels; - btr_output = para_malloc(2 * samples); + btr_output = arr_alloc(samples, 2); for (i = 0; i < samples; i++) btr_output[i] = read_u16(output + i + skip_idx); btr_add_output((char *)btr_output, samples * 2, btrn); diff --git a/string.c b/string.c index 0e04d374..2c6d35d6 100644 --- a/string.c +++ b/string.c @@ -15,78 +15,124 @@ #include "error.h" /** - * Paraslash's version of realloc(). + * Reallocate an array, abort on failure or bugs. * - * \param p Pointer to the memory block, may be \p NULL. - * \param size The desired new size. + * \param ptr Pointer to the memory block, may be NULL. + * \param nmemb Number of elements. + * \param size The size of one element in bytes. * - * A wrapper for realloc(3). It calls \p exit(\p EXIT_FAILURE) on errors, - * i.e. there is no need to check the return value in the caller. + * A wrapper for realloc(3) which aborts on invalid arguments or integer + * overflow. The wrapper also terminates the current process on allocation + * errors, so the caller does not need to check for failure. * * \return A pointer to newly allocated memory which is suitably aligned for - * any kind of variable and may be different from \a p. + * any kind of variable and may be different from ptr. * * \sa realloc(3). */ -__must_check void *para_realloc(void *p, size_t size) +__must_check void *arr_realloc(void *ptr, size_t nmemb, size_t size) +{ + size_t pr; + + assert(size > 0); + assert(nmemb > 0); + assert(!__builtin_mul_overflow(nmemb, size, &pr)); + assert(pr != 0); + ptr = realloc(ptr, pr); + assert(ptr); + return ptr; +} + +/** + * Allocate an array, abort on failure or bugs. + * + * \param nmemb See \ref arr_realloc(). + * \param size See \ref arr_realloc(). + * + * Like \ref arr_realloc(), this aborts on invalid arguments, integer overflow + * and allocation errors. + * + * \return A pointer to newly allocated memory which is suitably aligned for + * any kind of variable. + * + * \sa See \ref arr_realloc(). + */ +__must_check __malloc void *arr_alloc(size_t nmemb, size_t size) +{ + return arr_realloc(NULL, nmemb, size); +} + +/** + * Allocate and initialize an array, abort on failure or bugs. + * + * \param nmemb See \ref arr_realloc(). + * \param size See \ref arr_realloc(). + * + * This calls \ref arr_alloc() and zeroes-out the array. + * + * \return See \ref arr_alloc(). + */ +__must_check __malloc void *arr_zalloc(size_t nmemb, size_t size) { + void *ptr = arr_alloc(nmemb, size); + /* - * No need to check for NULL pointers: If p is NULL, the call - * to realloc is equivalent to malloc(size) + * This multiplication can not overflow because the above call to \ref + * arr_alloc() aborts on overflow. */ - assert(size); - if (!(p = realloc(p, size))) { - PARA_EMERG_LOG("realloc failed (size = %zu), aborting\n", - size); - exit(EXIT_FAILURE); - } - return p; + memset(ptr, 0, nmemb * size); + return ptr; } /** - * Paraslash's version of malloc(). + * Allocate and initialize memory. * * \param size The desired new size. * - * A wrapper for malloc(3) which exits on errors. - * - * \return A pointer to the allocated memory, which is suitably aligned for any - * kind of variable. + * \return A pointer to the allocated and zeroed-out memory, which is suitably + * aligned for any kind of variable. * - * \sa malloc(3). + * \sa \ref alloc(), calloc(3). */ -__must_check __malloc void *para_malloc(size_t size) +__must_check void *zalloc(size_t size) { - void *p; - - assert(size); - p = malloc(size); - if (!p) { - PARA_EMERG_LOG("malloc failed (size = %zu), aborting\n", - size); - exit(EXIT_FAILURE); - } - return p; + return arr_zalloc(1, size); } /** - * Paraslash's version of calloc(). + * Paraslash's version of realloc(). * + * \param p Pointer to the memory block, may be \p NULL. * \param size The desired new size. * - * A wrapper for calloc(3) which exits on errors. + * A wrapper for realloc(3). It calls \p exit(\p EXIT_FAILURE) on errors, + * i.e. there is no need to check the return value in the caller. * - * \return A pointer to the allocated and zeroed-out memory, which is suitably - * aligned for any kind of variable. + * \return A pointer to newly allocated memory which is suitably aligned for + * any kind of variable and may be different from \a p. * - * \sa calloc(3) + * \sa realloc(3). */ -__must_check __malloc void *para_calloc(size_t size) +__must_check void *para_realloc(void *p, size_t size) { - void *ret = para_malloc(size); + return arr_realloc(p, 1, size); +} - memset(ret, 0, size); - return ret; +/** + * Paraslash's version of malloc(). + * + * \param size The desired new size. + * + * A wrapper for malloc(3) which exits on errors. + * + * \return A pointer to the allocated memory, which is suitably aligned for any + * kind of variable. + * + * \sa malloc(3). + */ +__must_check __malloc void *alloc(size_t size) +{ + return arr_alloc(1, size); } /** @@ -94,22 +140,23 @@ __must_check __malloc void *para_calloc(size_t size) * * \param s The string to be duplicated. * - * A wrapper for strdup(3). It calls \p exit(EXIT_FAILURE) on errors, i.e. - * there is no need to check the return value in the caller. + * A strdup(3)-like function which aborts if insufficient memory was available + * to allocate the duplicated string, absolving the caller from the + * responsibility to check for failure. * - * \return A pointer to the duplicated string. If \a s was the \p NULL pointer, - * an pointer to an empty string is returned. + * \return A pointer to the duplicated string. Unlike strdup(3), the caller may + * pass NULL, in which case the function returns a pointer to an empty string. + * Regardless of whether or not NULL was passed, the returned string is + * allocated on the heap and has to be freed by the caller. * - * \sa strdup(3) + * \sa strdup(3). */ __must_check __malloc char *para_strdup(const char *s) { - char *ret; + char *dupped_string = strdup(s? s: ""); - if ((ret = strdup(s? s: ""))) - return ret; - PARA_EMERG_LOG("strdup failed, aborting\n"); - exit(EXIT_FAILURE); + assert(dupped_string); + return dupped_string; } /** @@ -137,7 +184,7 @@ __printf_2_0 unsigned xvasprintf(char **result, const char *fmt, va_list ap) size_t size = 150; va_list aq; - *result = para_malloc(size + 1); + *result = alloc(size + 1); va_copy(aq, ap); ret = vsnprintf(*result, size, fmt, aq); va_end(aq); @@ -339,7 +386,7 @@ int for_each_line(unsigned flags, char *buf, size_t size, if (!(flags & FELF_DISCARD_FIRST) || start != buf) { if (flags & FELF_READ_ONLY) { size_t s = end - start; - char *b = para_malloc(s + 1); + char *b = alloc(s + 1); memcpy(b, start, s); b[s] = '\0'; ret = line_handler(b, private_data); @@ -443,7 +490,7 @@ __printf_2_3 int para_printf(struct para_buffer *b, const char *fmt, ...) int ret, sz_off = (b->flags & PBF_SIZE_PREFIX)? 5 : 0; if (!b->buf) { - b->buf = para_malloc(128); + b->buf = alloc(128); b->size = 128; b->offset = 0; } @@ -560,7 +607,7 @@ static int get_next_word(const char *buf, const char *delim, char **word) char *out; int ret, state = 0; - out = para_malloc(strlen(buf) + 1); + out = alloc(strlen(buf) + 1); *out = '\0'; *word = out; for (in = buf; *in; in++) { @@ -692,7 +739,7 @@ void free_argv(char **argv) static int create_argv_offset(int offset, const char *buf, const char *delim, char ***result) { - char *word, **argv = para_malloc((offset + 1) * sizeof(char *)); + char *word, **argv = arr_alloc(offset + 1, sizeof(char *)); const char *p; int i, ret; @@ -704,7 +751,7 @@ static int create_argv_offset(int offset, const char *buf, const char *delim, goto err; if (!ret) break; - argv = para_realloc(argv, (i + 2) * sizeof(char*)); + argv = arr_realloc(argv, i + 2, sizeof(char*)); argv[i] = word; } argv[i] = NULL; @@ -800,7 +847,7 @@ int para_regcomp(regex_t *preg, const char *regex, int cflags) if (ret == 0) return 1; size = regerror(ret, preg, NULL, 0); - buf = para_malloc(size); + buf = alloc(size); regerror(ret, preg, buf, size); PARA_ERROR_LOG("%s\n", buf); free(buf); @@ -826,7 +873,7 @@ char *safe_strdup(const char *src, size_t len) char *p; assert(len < (size_t)-1); - p = para_malloc(len + 1); + p = alloc(len + 1); if (len > 0) memcpy(p, src, len); p[len] = '\0'; @@ -980,7 +1027,7 @@ __must_check int strwidth(const char *s, size_t *result) return -ERRNO_TO_PARA_ERROR(errno); if (num_wchars == 0) return 0; - dest = para_malloc((num_wchars + 1) * sizeof(*dest)); + dest = arr_alloc(num_wchars + 1, sizeof(*dest)); src = s; memset(&state, 0, sizeof(state)); num_wchars = mbsrtowcs(dest, &src, num_wchars, &state); @@ -1035,7 +1082,7 @@ __must_check int sanitize_str(const char *src, size_t max_width, num_wchars = mbsrtowcs(NULL, &src, 0, &state); if (num_wchars == (size_t)-1) return -ERRNO_TO_PARA_ERROR(errno); - wcs = para_malloc((num_wchars + 1) * sizeof(*wcs)); + wcs = arr_alloc(num_wchars + 1, sizeof(*wcs)); memset(&state, 0, sizeof(state)); num_wchars = mbsrtowcs(wcs, &src, num_wchars + 1, &state); assert(num_wchars != (size_t)-1); @@ -1046,7 +1093,7 @@ __must_check int sanitize_str(const char *src, size_t max_width, } wcs[n] = L'\0'; n = wcstombs(NULL, wcs, 0) + 1; - *result = para_malloc(n); + *result = alloc(n); num_wchars = wcstombs(*result, wcs, n); assert(num_wchars != (size_t)-1); free(wcs); diff --git a/string.h b/string.h index 84b6f787..060d6540 100644 --- a/string.h +++ b/string.h @@ -67,9 +67,12 @@ int for_each_line(unsigned flags, char *buf, size_t size, } \ ) +__must_check void *arr_realloc(void *ptr, size_t nmemb, size_t size); __must_check void *para_realloc(void *p, size_t size); -__must_check __malloc void *para_malloc(size_t size); -__must_check __malloc void *para_calloc(size_t size); +__must_check __malloc void *alloc(size_t size); +__must_check __malloc void *zalloc(size_t size); +__must_check __malloc void *arr_alloc(size_t nmemb, size_t size); +__must_check __malloc void *arr_zalloc(size_t nmemb, size_t size); __must_check __malloc char *para_strdup(const char *s); __printf_2_0 unsigned xvasprintf(char **result, const char *fmt, va_list ap); diff --git a/sync_filter.c b/sync_filter.c index 3174a4ef..b4710f67 100644 --- a/sync_filter.c +++ b/sync_filter.c @@ -102,7 +102,7 @@ static void sync_open(struct filter_node *fn) unsigned buddy_given; const struct lls_opt_result *r_b; - ctx = fn->private_data = para_calloc(sizeof(*ctx)); + ctx = fn->private_data = zalloc(sizeof(*ctx)); init_list_head(&ctx->buddies); /* create socket to listen for incoming packets */ @@ -148,7 +148,7 @@ static void sync_open(struct filter_node *fn) close(fd); goto fail; } - buddy = para_malloc(sizeof(*buddy)); + buddy = alloc(sizeof(*buddy)); buddy->fd = fd; buddy->sbi = sbi + i; buddy->ping_received = false; @@ -176,12 +176,12 @@ static void *sync_setup(const struct lls_parse_result *lpr) r_b = FILTER_CMD_OPT_RESULT(SYNC, BUDDY, lpr); n = lls_opt_given(r_b); - sbi = para_malloc(n * sizeof(*sbi)); + sbi = arr_alloc(n, sizeof(*sbi)); PARA_INFO_LOG("initializing buddy info array of length %u\n", n); for (i = 0; i < n; i++) { const char *url = lls_string_val(i, r_b); size_t len = strlen(url); - char *host = para_malloc(len + 1); + char *host = alloc(len + 1); int port; struct addrinfo *ai; diff --git a/udp_send.c b/udp_send.c index ac656ff2..28947987 100644 --- a/udp_send.c +++ b/udp_send.c @@ -326,8 +326,8 @@ static int udp_com_add(struct sender_command_data *scd) sc->name); return -E_TARGET_EXISTS; } - ut = para_calloc(sizeof(*ut)); - sc = para_calloc(sizeof(*sc)); + ut = zalloc(sizeof(*ut)); + sc = zalloc(sizeof(*sc)); ut->fcp.slices_per_group = scd->slices_per_group; ut->fcp.data_slices_per_group = scd->data_slices_per_group; ut->fcp.init_fec = udp_init_fec; diff --git a/user_list.c b/user_list.c index 32a4309d..f2436c9e 100644 --- a/user_list.c +++ b/user_list.c @@ -110,7 +110,7 @@ void user_list_init(const char *user_list_file) apc_free_pubkey(pubkey); continue; } - u = para_malloc(sizeof(*u)); + u = alloc(sizeof(*u)); u->name = para_strdup(n); u->pubkey = pubkey; u->perms = 0; diff --git a/vss.c b/vss.c index 4f270c4a..dd4ac2fb 100644 --- a/vss.c +++ b/vss.c @@ -335,10 +335,10 @@ static int initialize_fec_client(struct fec_client *fc, struct vss_task *vsst) ret = fec_new(k, n, &fc->parms); if (ret < 0) return ret; - fc->src_data = para_malloc(k * sizeof(char *)); + fc->src_data = arr_alloc(k, sizeof(char *)); for (i = 0; i < k; i++) - fc->src_data[i] = para_malloc(fc->mps); - fc->enc_buf = para_malloc(fc->mps); + fc->src_data[i] = alloc(fc->mps); + fc->enc_buf = alloc(fc->mps); fc->state = FEC_STATE_READY_TO_RUN; fc->next_header_time.tv_sec = 0; @@ -671,7 +671,7 @@ size_t vss_get_fec_eof_packet(const char **buf) struct fec_client *vss_add_fec_client(struct sender_client *sc, struct fec_client_parms *fcp) { - struct fec_client *fc = para_calloc(sizeof(*fc)); + struct fec_client *fc = zalloc(sizeof(*fc)); fc->sc = sc; fc->fcp = fcp; diff --git a/wav_filter.c b/wav_filter.c index 692306b5..7d6c3714 100644 --- a/wav_filter.c +++ b/wav_filter.c @@ -53,7 +53,7 @@ static void wav_open(struct filter_node *fn) { int *bof; - fn->private_data = para_malloc(sizeof(int)); + fn->private_data = alloc(sizeof(int)); bof = fn->private_data; *bof = 1; } @@ -101,7 +101,7 @@ static int wav_post_monitor(__a_unused struct sched *s, void *context) free(buf); if (ret < 0) goto err; - header = para_malloc(WAV_HEADER_LEN); + header = alloc(WAV_HEADER_LEN); make_wav_header(ch, rate, header); btr_add_output(header, WAV_HEADER_LEN, btrn); ret = -E_WAV_SUCCESS; diff --git a/web/manual.md b/web/manual.md index 78834a4d..b5329ea0 100644 --- a/web/manual.md +++ b/web/manual.md @@ -309,8 +309,8 @@ repository with git clone git://git.tuebingen.mpg.de/lopsub - [gcc](ftp://ftp.gnu.org/pub/gnu/gcc) or -[clang](http://clang.llvm.org). All gcc versions >= 4.2 are currently -supported. Clang version 1.1 or newer should work as well. +[clang](http://clang.llvm.org). All gcc versions >= 5.4 are currently +supported. Moderately recent versions of clang should work as well. - [gnu make](ftp://ftp.gnu.org/pub/gnu/make) is also shipped with the disto. On BSD systems the gnu make executable is often called gmake. diff --git a/wma_afh.c b/wma_afh.c index 63e49677..8bff7cfc 100644 --- a/wma_afh.c +++ b/wma_afh.c @@ -195,7 +195,7 @@ static int wma_make_chunk_table(char *buf, size_t buf_size, uint32_t packet_size size_t ct_size = 250; int ret, count = 0, num_frames, num_superframes; - afhi->chunk_table = para_malloc(ct_size * sizeof(uint32_t)); + afhi->chunk_table = arr_alloc(ct_size, sizeof(uint32_t)); afhi->chunk_table[0] = 0; afhi->chunk_table[1] = afhi->header_len; @@ -318,7 +318,7 @@ static int convert_utf8_to_utf16(char *src, char **dst) int ret; if (!src || !*src) { - *dst = para_calloc(2); + *dst = zalloc(2); return 0; } /* @@ -334,7 +334,7 @@ static int convert_utf8_to_utf16(char *src, char **dst) /* even though src is in UTF-8, strlen() should DTRT */ inbytes = inbytesleft = strlen(src); outbytes = outbytesleft = 4 * inbytes + 2; /* hope that's enough */ - *dst = outbuf = para_malloc(outbytes); + *dst = outbuf = alloc(outbytes); sz = iconv(cd, ICONV_CAST &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (sz == (size_t)-1) { ret = -ERRNO_TO_PARA_ERROR(errno); @@ -411,7 +411,7 @@ static int make_cdo(struct taginfo *tags, const struct asf_object *cdo, result->size = 16 + 8 + 5 * 2 + title_bytes + artist_bytes + orig_cr_bytes + comment_bytes + orig_rating_bytes; PARA_DEBUG_LOG("cdo is %zu bytes\n", (size_t)result->size); - p = result->ptr = para_malloc(result->size); + p = result->ptr = alloc(result->size); memcpy(p, content_description_header, 16); p += 16; write_u64(p, result->size); @@ -469,7 +469,7 @@ static int make_ecdo(struct taginfo *tags, struct asf_object *result) result->size += 2 + sizeof(album_tag_header) + 2 + 2 + 2 + album_bytes; result->size += 2 + sizeof(year_tag_header) + 2 + 2 + 2 + year_bytes; - p = result->ptr = para_malloc(result->size); + p = result->ptr = alloc(result->size); memcpy(p, extended_content_header, 16); p += 16; write_u64(p, result->size); @@ -622,7 +622,7 @@ static int wma_rewrite_tags(const char *map, size_t mapsize, if (top.reserved2 != 2) return -E_NO_WMA; p++; /* objects start at p */ - top.objects = para_malloc(top.num_objects * sizeof(struct asf_object)); + top.objects = arr_alloc(top.num_objects, sizeof(struct asf_object)); ret = read_asf_objects(p, top.size - (p - map), top.num_objects, top.objects, &ton); if (ret < 0) diff --git a/wmadec_filter.c b/wmadec_filter.c index 8061f9ae..f7ee2c4d 100644 --- a/wmadec_filter.c +++ b/wmadec_filter.c @@ -159,8 +159,8 @@ static void init_coef_vlc(struct private_wmadec_data *pwd, int sidx, int didx) int i, l, j, k, level, n = src->n; init_vlc(dst, VLCBITS, n, src->huffbits, src->huffcodes, 4); - pwd->run_table[didx] = para_malloc(n * sizeof(uint16_t)); - pwd->level_table[didx] = para_malloc(n * sizeof(uint16_t)); + pwd->run_table[didx] = arr_alloc(n, sizeof(uint16_t)); + pwd->level_table[didx] = arr_alloc(n, sizeof(uint16_t)); i = 2; level = 1; k = 0; @@ -427,7 +427,7 @@ static int wma_decode_init(char *initial_buf, int len, struct private_wmadec_dat int ret, i; PARA_NOTICE_LOG("initial buf: %d bytes\n", len); - pwd = para_calloc(sizeof(*pwd)); + pwd = zalloc(sizeof(*pwd)); ret = read_asf_header(initial_buf, len, &pwd->ahi); if (ret <= 0) { free(pwd); @@ -1196,7 +1196,7 @@ next_buffer: if (fn->min_iqs > len) goto success; out_size = WMA_OUTPUT_BUFFER_SIZE; - out = para_malloc(out_size); + out = alloc(out_size); ret = wma_decode_superframe(pwd, out, &out_size, (uint8_t *)in + WMA_FRAME_SKIP); if (ret < 0) { diff --git a/write.c b/write.c index 9e2de3d8..f7018aa1 100644 --- a/write.c +++ b/write.c @@ -89,7 +89,7 @@ static int setup_and_schedule(struct lls_parse_result *lpr) }, &s); n = writer_given? writer_given : 1; - wns = para_calloc(n * sizeof(*wns)); + wns = arr_zalloc(n, sizeof(*wns)); for (i = 0; i < n; i++) { const char *arg = i < writer_given? lls_string_val(i, OPT_RESULT(WRITER, lpr)) : NULL; diff --git a/write_common.c b/write_common.c index 806d682f..9a130905 100644 --- a/write_common.c +++ b/write_common.c @@ -85,7 +85,7 @@ int check_writer_arg_or_die(const char *wa, struct lls_parse_result **lprp) if (!wa || !*wa) { writer_num = default_writer_id(); cmd = WRITE_CMD(writer_num); - argv = para_malloc(2 * sizeof(char *)); + argv = alloc(2 * sizeof(char *)); argc = 1; argv[0] = para_strdup(lls_command_name(cmd)); argv[1] = NULL; diff --git a/yy/mp.y b/yy/mp.y index 06d76101..8df4f20e 100644 --- a/yy/mp.y +++ b/yy/mp.y @@ -59,7 +59,7 @@ enum semantic_types { static struct mp_ast_node *ast_node_raw(int id) { - struct mp_ast_node *node = para_malloc(sizeof(struct mp_ast_node)); + struct mp_ast_node *node = alloc(sizeof(struct mp_ast_node)); node->id = id; return node; } @@ -76,7 +76,7 @@ static struct mp_ast_node *ast_node_new_unary(int id, struct mp_ast_node *child) { struct mp_ast_node *node = ast_node_raw(id); node->num_children = 1; - node->children = para_malloc(sizeof(struct mp_ast_node *)); + node->children = alloc(sizeof(struct mp_ast_node *)); node->children[0] = child; return node; } @@ -86,7 +86,7 @@ static struct mp_ast_node *ast_node_new_binary(int id, struct mp_ast_node *left, { struct mp_ast_node *node = ast_node_raw(id); node->num_children = 2; - node->children = para_malloc(2 * sizeof(struct mp_ast_node *)); + node->children = arr_alloc(2, sizeof(struct mp_ast_node *)); node->children[0] = left; node->children[1] = right; return node;