diff options
author | comex | 2015-03-01 23:07:15 -0500 |
---|---|---|
committer | comex | 2015-03-01 23:07:15 -0500 |
commit | 7f24621bec0b0a5b3cab9ec2dfc68929a2d49d25 (patch) | |
tree | 7c227bfa4d8010e23b726eed8efb6bc51746e3f5 /lib/cbit | |
parent | seems to work (diff) | |
download | substitute-7f24621bec0b0a5b3cab9ec2dfc68929a2d49d25.tar.gz |
A number of critical fixes painstakingly discovered in the slowest way possible.
Diffstat (limited to 'lib/cbit')
-rw-r--r-- | lib/cbit/vec.c | 6 | ||||
-rw-r--r-- | lib/cbit/vec.h | 4 |
2 files changed, 7 insertions, 3 deletions
diff --git a/lib/cbit/vec.c b/lib/cbit/vec.c index 21038a2..2f875ff 100644 --- a/lib/cbit/vec.c +++ b/lib/cbit/vec.c @@ -1,12 +1,16 @@ #include "cbit/vec.h" #include <stdio.h> +#include <stdlib.h> void vec_realloc_internal(struct vec_internal *vi, size_t new_capacity, size_t esize) { + if (new_capacity == 0) + abort(); size_t new_size = safe_mul(new_capacity, esize); if (vi->els == vi->storage) { void *new = malloc(new_size); - memcpy(new, vi->els, vi->capacity * esize); + size_t min_cap = new_capacity < vi->capacity ? new_capacity : vi->capacity; + memcpy(new, vi->els, min_cap * esize); vi->els = new; } else { vi->els = realloc(vi->els, new_size); diff --git a/lib/cbit/vec.h b/lib/cbit/vec.h index 2889ac1..eddee6a 100644 --- a/lib/cbit/vec.h +++ b/lib/cbit/vec.h @@ -73,8 +73,8 @@ void vec_realloc_internal_as_necessary(struct vec_internal *vi, VEC_TY(name) vec_pop_##name(struct vec_##name *v) { \ size_t i = v->length - 1; \ VEC_TY(name) ret = v->els[i]; \ - if (i - 1 < v->capacity / 3) \ - vec_realloc_internal_as_necessary(&v->vi, i - 1, sizeof(v->els[0])); \ + if (v->els != v->storage && i < v->capacity / 3) \ + vec_realloc_internal_as_necessary(&v->vi, i, sizeof(v->els[0])); \ v->length = i; \ return ret; \ } \ |