mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Try to remove potential overflow bugs.
Also make integer to size_t casts explicit rather than relying on int32_t * sizeof(x) = size_t. This is kind of a personal preference for this problem.
This commit is contained in:
		| @@ -36,7 +36,7 @@ JanetArray *janet_array(int32_t capacity) { | ||||
|     Janet *data = NULL; | ||||
|     if (capacity > 0) { | ||||
|         janet_vm_next_collection += capacity * sizeof(Janet); | ||||
|         data = (Janet *) malloc(sizeof(Janet) * capacity); | ||||
|         data = (Janet *) malloc(sizeof(Janet) * (size_t) capacity); | ||||
|         if (NULL == data) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
| @@ -52,7 +52,7 @@ JanetArray *janet_array_n(const Janet *elements, int32_t n) { | ||||
|     JanetArray *array = janet_gcalloc(JANET_MEMORY_ARRAY, sizeof(JanetArray)); | ||||
|     array->capacity = n; | ||||
|     array->count = n; | ||||
|     array->data = malloc(sizeof(Janet) * n); | ||||
|     array->data = malloc(sizeof(Janet) * (size_t) n); | ||||
|     if (!array->data) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
| @@ -166,9 +166,12 @@ static Janet cfun_array_peek(int32_t argc, Janet *argv) { | ||||
| static Janet cfun_array_push(int32_t argc, Janet *argv) { | ||||
|     janet_arity(argc, 1, -1); | ||||
|     JanetArray *array = janet_getarray(argv, 0); | ||||
|     if (INT32_MAX - argc + 1 <= array->count) { | ||||
|         janet_panic("array overflow"); | ||||
|     } | ||||
|     int32_t newcount = array->count - 1 + argc; | ||||
|     janet_array_ensure(array, newcount, 2); | ||||
|     if (argc > 1) memcpy(array->data + array->count, argv + 1, (argc - 1) * sizeof(Janet)); | ||||
|     if (argc > 1) memcpy(array->data + array->count, argv + 1, (size_t) (argc - 1) * sizeof(Janet)); | ||||
|     array->count = newcount; | ||||
|     return argv[0]; | ||||
| } | ||||
|   | ||||
| @@ -580,7 +580,7 @@ static JanetAssembleResult janet_asm1(JanetAssembler *parent, Janet source, int | ||||
|     x = janet_get1(s, janet_csymbolv("constants")); | ||||
|     if (janet_indexed_view(x, &arr, &count)) { | ||||
|         def->constants_length = count; | ||||
|         def->constants = malloc(sizeof(Janet) * count); | ||||
|         def->constants = malloc(sizeof(Janet) * (size_t) count); | ||||
|         if (NULL == def->constants) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
| @@ -659,7 +659,7 @@ static JanetAssembleResult janet_asm1(JanetAssembler *parent, Janet source, int | ||||
|         } | ||||
|         /* Allocate bytecode array */ | ||||
|         def->bytecode_length = blength; | ||||
|         def->bytecode = malloc(sizeof(uint32_t) * blength); | ||||
|         def->bytecode = malloc(sizeof(uint32_t) * (size_t) blength); | ||||
|         if (NULL == def->bytecode) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
| @@ -701,7 +701,7 @@ static JanetAssembleResult janet_asm1(JanetAssembler *parent, Janet source, int | ||||
|     x = janet_get1(s, janet_csymbolv("sourcemap")); | ||||
|     if (janet_indexed_view(x, &arr, &count)) { | ||||
|         janet_asm_assert(&a, count == def->bytecode_length, "sourcemap must have the same length as the bytecode"); | ||||
|         def->sourcemap = malloc(sizeof(JanetSourceMapping) * count); | ||||
|         def->sourcemap = malloc(sizeof(JanetSourceMapping) * (size_t) count); | ||||
|         for (i = 0; i < count; i++) { | ||||
|             const Janet *tup; | ||||
|             Janet entry = arr[i]; | ||||
|   | ||||
| @@ -33,7 +33,7 @@ JanetBuffer *janet_buffer_init(JanetBuffer *buffer, int32_t capacity) { | ||||
|     uint8_t *data = NULL; | ||||
|     if (capacity > 0) { | ||||
|         janet_vm_next_collection += capacity; | ||||
|         data = malloc(sizeof(uint8_t) * capacity); | ||||
|         data = malloc(sizeof(uint8_t) * (size_t) capacity); | ||||
|         if (NULL == data) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
| @@ -63,7 +63,7 @@ void janet_buffer_ensure(JanetBuffer *buffer, int32_t capacity, int32_t growth) | ||||
|     int64_t big_capacity = ((int64_t) capacity) * growth; | ||||
|     capacity = big_capacity > INT32_MAX ? INT32_MAX : (int32_t) big_capacity; | ||||
|     janet_vm_next_collection += capacity - buffer->capacity; | ||||
|     new_data = realloc(old, capacity * sizeof(uint8_t)); | ||||
|     new_data = realloc(old, (size_t) capacity * sizeof(uint8_t)); | ||||
|     if (NULL == new_data) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
|   | ||||
| @@ -708,7 +708,7 @@ JanetFuncDef *janetc_pop_funcdef(JanetCompiler *c) { | ||||
|     /* Copy bytecode (only last chunk) */ | ||||
|     def->bytecode_length = janet_v_count(c->buffer) - scope->bytecode_start; | ||||
|     if (def->bytecode_length) { | ||||
|         size_t s = sizeof(int32_t) * def->bytecode_length; | ||||
|         size_t s = sizeof(int32_t) * (size_t) def->bytecode_length; | ||||
|         def->bytecode = malloc(s); | ||||
|         if (NULL == def->bytecode) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
| @@ -716,7 +716,7 @@ JanetFuncDef *janetc_pop_funcdef(JanetCompiler *c) { | ||||
|         memcpy(def->bytecode, c->buffer + scope->bytecode_start, s); | ||||
|         janet_v__cnt(c->buffer) = scope->bytecode_start; | ||||
|         if (NULL != c->mapbuffer && c->source) { | ||||
|             size_t s = sizeof(JanetSourceMapping) * def->bytecode_length; | ||||
|             size_t s = sizeof(JanetSourceMapping) * (size_t) def->bytecode_length; | ||||
|             def->sourcemap = malloc(s); | ||||
|             if (NULL == def->sourcemap) { | ||||
|                 JANET_OUT_OF_MEMORY; | ||||
|   | ||||
| @@ -402,17 +402,19 @@ static Janet janet_core_gccollect(int32_t argc, Janet *argv) { | ||||
|  | ||||
| static Janet janet_core_gcsetinterval(int32_t argc, Janet *argv) { | ||||
|     janet_fixarity(argc, 1); | ||||
|     int32_t val = janet_getinteger(argv, 0); | ||||
|     if (val < 0) | ||||
|         janet_panic("expected non-negative integer"); | ||||
|     janet_vm_gc_interval = val; | ||||
|     size_t s = janet_getsize(argv, 0); | ||||
|     /* limit interval to 48 bits */ | ||||
|     if (s > 0xFFFFFFFFFFFFUl) { | ||||
|         janet_panic("interval too large"); | ||||
|     } | ||||
|     janet_vm_gc_interval = s; | ||||
|     return janet_wrap_nil(); | ||||
| } | ||||
|  | ||||
| static Janet janet_core_gcinterval(int32_t argc, Janet *argv) { | ||||
|     (void) argv; | ||||
|     janet_fixarity(argc, 0); | ||||
|     return janet_wrap_number(janet_vm_gc_interval); | ||||
|     return janet_wrap_number((double) janet_vm_gc_interval); | ||||
| } | ||||
|  | ||||
| static Janet janet_core_type(int32_t argc, Janet *argv) { | ||||
|   | ||||
| @@ -47,7 +47,7 @@ static JanetFiber *fiber_alloc(int32_t capacity) { | ||||
|         capacity = 32; | ||||
|     } | ||||
|     fiber->capacity = capacity; | ||||
|     data = malloc(sizeof(Janet) * capacity); | ||||
|     data = malloc(sizeof(Janet) * (size_t) capacity); | ||||
|     if (NULL == data) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
| @@ -211,7 +211,7 @@ int janet_fiber_funcframe(JanetFiber *fiber, JanetFunction *func) { | ||||
| static void janet_env_detach(JanetFuncEnv *env) { | ||||
|     /* Check for closure environment */ | ||||
|     if (env) { | ||||
|         size_t s = sizeof(Janet) * env->length; | ||||
|         size_t s = sizeof(Janet) * (size_t) env->length; | ||||
|         Janet *vmem = malloc(s); | ||||
|         janet_vm_next_collection += (uint32_t) s; | ||||
|         if (NULL == vmem) { | ||||
|   | ||||
| @@ -31,14 +31,14 @@ | ||||
|  | ||||
| /* GC State */ | ||||
| JANET_THREAD_LOCAL void *janet_vm_blocks; | ||||
| JANET_THREAD_LOCAL uint32_t janet_vm_gc_interval; | ||||
| JANET_THREAD_LOCAL uint32_t janet_vm_next_collection; | ||||
| JANET_THREAD_LOCAL size_t janet_vm_gc_interval; | ||||
| JANET_THREAD_LOCAL size_t janet_vm_next_collection; | ||||
| JANET_THREAD_LOCAL int janet_vm_gc_suspend = 0; | ||||
|  | ||||
| /* Roots */ | ||||
| JANET_THREAD_LOCAL Janet *janet_vm_roots; | ||||
| JANET_THREAD_LOCAL uint32_t janet_vm_root_count; | ||||
| JANET_THREAD_LOCAL uint32_t janet_vm_root_capacity; | ||||
| JANET_THREAD_LOCAL size_t janet_vm_root_count; | ||||
| JANET_THREAD_LOCAL size_t janet_vm_root_capacity; | ||||
|  | ||||
| /* Scratch Memory */ | ||||
| #ifdef JANET_64 | ||||
| @@ -65,7 +65,7 @@ static void janet_mark_string(const uint8_t *str); | ||||
| static void janet_mark_fiber(JanetFiber *fiber); | ||||
| static void janet_mark_abstract(void *adata); | ||||
|  | ||||
| /* Local state that is only temporary */ | ||||
| /* Local state that is only temporary for gc */ | ||||
| static JANET_THREAD_LOCAL uint32_t depth = JANET_RECURSION_GUARD; | ||||
| static JANET_THREAD_LOCAL uint32_t orig_rootcount; | ||||
|  | ||||
| @@ -348,7 +348,7 @@ void *janet_gcalloc(enum JanetMemoryType type, size_t size) { | ||||
|     mem->flags = type; | ||||
|  | ||||
|     /* Prepend block to heap list */ | ||||
|     janet_vm_next_collection += (int32_t) size; | ||||
|     janet_vm_next_collection += size; | ||||
|     mem->next = janet_vm_blocks; | ||||
|     janet_vm_blocks = mem; | ||||
|  | ||||
|   | ||||
| @@ -693,7 +693,7 @@ static const uint8_t *unmarshal_one_env( | ||||
|                 janet_panic("invalid funcenv length"); | ||||
|         } else { | ||||
|             /* Off stack variant */ | ||||
|             env->as.values = malloc(sizeof(Janet) * length); | ||||
|             env->as.values = malloc(sizeof(Janet) * (size_t) length); | ||||
|             if (!env->as.values) { | ||||
|                 JANET_OUT_OF_MEMORY; | ||||
|             } | ||||
| @@ -798,7 +798,7 @@ static const uint8_t *unmarshal_one_def( | ||||
|  | ||||
|         /* Unmarshal environments */ | ||||
|         if (def->flags & JANET_FUNCDEF_FLAG_HASENVS) { | ||||
|             def->environments = calloc(1, sizeof(int32_t) * environments_length); | ||||
|             def->environments = calloc(1, sizeof(int32_t) * (size_t) environments_length); | ||||
|             if (!def->environments) { | ||||
|                 JANET_OUT_OF_MEMORY; | ||||
|             } | ||||
| @@ -812,7 +812,7 @@ static const uint8_t *unmarshal_one_def( | ||||
|  | ||||
|         /* Unmarshal sub funcdefs */ | ||||
|         if (def->flags & JANET_FUNCDEF_FLAG_HASDEFS) { | ||||
|             def->defs = calloc(1, sizeof(JanetFuncDef *) * defs_length); | ||||
|             def->defs = calloc(1, sizeof(JanetFuncDef *) * (size_t) defs_length); | ||||
|             if (!def->defs) { | ||||
|                 JANET_OUT_OF_MEMORY; | ||||
|             } | ||||
| @@ -827,7 +827,7 @@ static const uint8_t *unmarshal_one_def( | ||||
|         /* Unmarshal source maps if needed */ | ||||
|         if (def->flags & JANET_FUNCDEF_FLAG_HASSOURCEMAP) { | ||||
|             int32_t current = 0; | ||||
|             def->sourcemap = malloc(sizeof(JanetSourceMapping) * bytecode_length); | ||||
|             def->sourcemap = malloc(sizeof(JanetSourceMapping) * (size_t) bytecode_length); | ||||
|             if (!def->sourcemap) { | ||||
|                 JANET_OUT_OF_MEMORY; | ||||
|             } | ||||
|   | ||||
| @@ -157,7 +157,7 @@ static char **os_execute_env(int32_t argc, const Janet *argv) { | ||||
|     char **envp = NULL; | ||||
|     if (argc > 2) { | ||||
|         JanetDictView dict = janet_getdictionary(argv, 2); | ||||
|         envp = janet_smalloc(sizeof(char *) * (dict.len + 1)); | ||||
|         envp = janet_smalloc(sizeof(char *) * ((size_t)dict.len + 1)); | ||||
|         int32_t j = 0; | ||||
|         for (int32_t i = 0; i < dict.cap; i++) { | ||||
|             const JanetKV *kv = dict.kvs + i; | ||||
| @@ -176,7 +176,7 @@ static char **os_execute_env(int32_t argc, const Janet *argv) { | ||||
|                 } | ||||
|             } | ||||
|             if (skip) continue; | ||||
|             char *envitem = janet_smalloc(klen + vlen + 2); | ||||
|             char *envitem = janet_smalloc((size_t) klen + (size_t) vlen + 2); | ||||
|             memcpy(envitem, keys, klen); | ||||
|             envitem[klen] = '='; | ||||
|             memcpy(envitem + klen + 1, vals, vlen); | ||||
| @@ -338,7 +338,7 @@ static Janet os_execute(int32_t argc, Janet *argv) { | ||||
|     return janet_wrap_integer(status); | ||||
| #else | ||||
|  | ||||
|     const char **child_argv = janet_smalloc(sizeof(char *) * (exargs.len + 1)); | ||||
|     const char **child_argv = janet_smalloc(sizeof(char *) * ((size_t) exargs.len + 1)); | ||||
|     for (int32_t i = 0; i < exargs.len; i++) | ||||
|         child_argv[i] = janet_getcstring(exargs.items, i); | ||||
|     child_argv[exargs.len] = NULL; | ||||
|   | ||||
| @@ -1046,7 +1046,7 @@ static void *peg_unmarshal(JanetMarshalContext *ctx) { | ||||
|     size_t bytecode_start = size_padded(sizeof(Peg), sizeof(uint32_t)); | ||||
|     size_t bytecode_size = bytecode_len * sizeof(uint32_t); | ||||
|     size_t constants_start = size_padded(bytecode_start + bytecode_size, sizeof(Janet)); | ||||
|     size_t total_size = constants_start + sizeof(Janet) * num_constants; | ||||
|     size_t total_size = constants_start + sizeof(Janet) * (size_t) num_constants; | ||||
|  | ||||
|     /* DOS prevention? I.E. we could read bytecode and constants before | ||||
|      * hand so we don't allocated a ton of memory on bad, short input */ | ||||
|   | ||||
| @@ -67,7 +67,7 @@ void janetc_regalloc_clone(JanetcRegisterAllocator *dest, JanetcRegisterAllocato | ||||
|     dest->count = src->count; | ||||
|     dest->capacity = src->capacity; | ||||
|     dest->max = src->max; | ||||
|     size = sizeof(uint32_t) * dest->capacity; | ||||
|     size = sizeof(uint32_t) * (size_t) dest->capacity; | ||||
|     dest->regtemps = 0; | ||||
|     if (size) { | ||||
|         dest->chunks = malloc(size); | ||||
| @@ -87,7 +87,7 @@ static void pushchunk(JanetcRegisterAllocator *ra) { | ||||
|     int32_t newcount = ra->count + 1; | ||||
|     if (newcount > ra->capacity) { | ||||
|         int32_t newcapacity = newcount * 2; | ||||
|         ra->chunks = realloc(ra->chunks, newcapacity * sizeof(uint32_t)); | ||||
|         ra->chunks = realloc(ra->chunks, (size_t) newcapacity * sizeof(uint32_t)); | ||||
|         if (!ra->chunks) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
|   | ||||
| @@ -59,14 +59,14 @@ extern JANET_THREAD_LOCAL uint32_t janet_vm_cache_deleted; | ||||
|  | ||||
| /* Garbage collection */ | ||||
| extern JANET_THREAD_LOCAL void *janet_vm_blocks; | ||||
| extern JANET_THREAD_LOCAL uint32_t janet_vm_gc_interval; | ||||
| extern JANET_THREAD_LOCAL uint32_t janet_vm_next_collection; | ||||
| extern JANET_THREAD_LOCAL size_t janet_vm_gc_interval; | ||||
| extern JANET_THREAD_LOCAL size_t janet_vm_next_collection; | ||||
| extern JANET_THREAD_LOCAL int janet_vm_gc_suspend; | ||||
|  | ||||
| /* GC roots */ | ||||
| extern JANET_THREAD_LOCAL Janet *janet_vm_roots; | ||||
| extern JANET_THREAD_LOCAL uint32_t janet_vm_root_count; | ||||
| extern JANET_THREAD_LOCAL uint32_t janet_vm_root_capacity; | ||||
| extern JANET_THREAD_LOCAL size_t janet_vm_root_count; | ||||
| extern JANET_THREAD_LOCAL size_t janet_vm_root_capacity; | ||||
|  | ||||
| /* Scratch memory */ | ||||
| extern JANET_THREAD_LOCAL void **janet_scratch_mem; | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
|  | ||||
| /* Begin building a string */ | ||||
| uint8_t *janet_string_begin(int32_t length) { | ||||
|     JanetStringHead *head = janet_gcalloc(JANET_MEMORY_STRING, sizeof(JanetStringHead) + length + 1); | ||||
|     JanetStringHead *head = janet_gcalloc(JANET_MEMORY_STRING, sizeof(JanetStringHead) + (size_t) length + 1); | ||||
|     head->length = length; | ||||
|     uint8_t *data = (uint8_t *)head->data; | ||||
|     data[length] = 0; | ||||
| @@ -47,7 +47,7 @@ const uint8_t *janet_string_end(uint8_t *str) { | ||||
|  | ||||
| /* Load a buffer as a string */ | ||||
| const uint8_t *janet_string(const uint8_t *buf, int32_t len) { | ||||
|     JanetStringHead *head = janet_gcalloc(JANET_MEMORY_STRING, sizeof(JanetStringHead) + len + 1); | ||||
|     JanetStringHead *head = janet_gcalloc(JANET_MEMORY_STRING, sizeof(JanetStringHead) + (size_t) len + 1); | ||||
|     head->length = len; | ||||
|     head->hash = janet_string_calchash(buf, len); | ||||
|     uint8_t *data = (uint8_t *)head->data; | ||||
|   | ||||
| @@ -87,7 +87,7 @@ static uint32_t *bignat_extra(struct BigNat *mant, int32_t n) { | ||||
|     int32_t newn = oldn + n; | ||||
|     if (mant->cap < newn) { | ||||
|         int32_t newcap = 2 * newn; | ||||
|         uint32_t *mem = realloc(mant->digits, newcap * sizeof(uint32_t)); | ||||
|         uint32_t *mem = realloc(mant->digits, (size_t) newcap * sizeof(uint32_t)); | ||||
|         if (NULL == mem) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
|   | ||||
| @@ -34,7 +34,7 @@ JanetKV *janet_struct_begin(int32_t count) { | ||||
|     int32_t capacity = janet_tablen(2 * count); | ||||
|     if (capacity < 0) capacity = janet_tablen(count + 1); | ||||
|  | ||||
|     size_t size = sizeof(JanetStructHead) + capacity * sizeof(JanetKV); | ||||
|     size_t size = sizeof(JanetStructHead) + (size_t) capacity * sizeof(JanetKV); | ||||
|     JanetStructHead *head = janet_gcalloc(JANET_MEMORY_STRUCT, size); | ||||
|     head->length = count; | ||||
|     head->capacity = capacity; | ||||
|   | ||||
| @@ -45,7 +45,7 @@ JANET_THREAD_LOCAL uint32_t janet_vm_cache_deleted = 0; | ||||
| /* Initialize the cache (allocate cache memory) */ | ||||
| void janet_symcache_init() { | ||||
|     janet_vm_cache_capacity = 1024; | ||||
|     janet_vm_cache = calloc(1, janet_vm_cache_capacity * sizeof(const uint8_t *)); | ||||
|     janet_vm_cache = calloc(1, (size_t) janet_vm_cache_capacity * sizeof(const uint8_t *)); | ||||
|     if (NULL == janet_vm_cache) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
| @@ -122,7 +122,7 @@ notfound: | ||||
| static void janet_cache_resize(uint32_t newCapacity) { | ||||
|     uint32_t i, oldCapacity; | ||||
|     const uint8_t **oldCache = janet_vm_cache; | ||||
|     const uint8_t **newCache = calloc(1, newCapacity * sizeof(const uint8_t *)); | ||||
|     const uint8_t **newCache = calloc(1, (size_t) newCapacity * sizeof(const uint8_t *)); | ||||
|     if (newCache == NULL) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
| @@ -179,7 +179,7 @@ const uint8_t *janet_symbol(const uint8_t *str, int32_t len) { | ||||
|     const uint8_t **bucket = janet_symcache_findmem(str, len, hash, &success); | ||||
|     if (success) | ||||
|         return *bucket; | ||||
|     JanetStringHead *head = janet_gcalloc(JANET_MEMORY_SYMBOL, sizeof(JanetStringHead) + len + 1); | ||||
|     JanetStringHead *head = janet_gcalloc(JANET_MEMORY_SYMBOL, sizeof(JanetStringHead) + (size_t) len + 1); | ||||
|     head->hash = hash; | ||||
|     head->length = len; | ||||
|     newstr = (uint8_t *)(head->data); | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
|  | ||||
| static void *janet_memalloc_empty_local(int32_t count) { | ||||
|     int32_t i; | ||||
|     void *mem = janet_smalloc(count * sizeof(JanetKV)); | ||||
|     void *mem = janet_smalloc((size_t) count * sizeof(JanetKV)); | ||||
|     JanetKV *mmem = (JanetKV *)mem; | ||||
|     for (i = 0; i < count; i++) { | ||||
|         JanetKV *kv = mmem + i; | ||||
| @@ -241,7 +241,7 @@ JanetTable *janet_table_clone(JanetTable *table) { | ||||
|     if (NULL == newTable->data) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
|     memcpy(newTable->data, table->data, table->capacity * sizeof(JanetKV)); | ||||
|     memcpy(newTable->data, table->data, (size_t) table->capacity * sizeof(JanetKV)); | ||||
|     return newTable; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -77,7 +77,7 @@ static JANET_THREAD_LOCAL JanetMailbox *janet_vm_mailbox = NULL; | ||||
| static JANET_THREAD_LOCAL JanetThread *janet_vm_thread_current = NULL; | ||||
|  | ||||
| static JanetMailbox *janet_mailbox_create(JanetMailbox *parent, int refCount, uint16_t capacity) { | ||||
|     JanetMailbox *mailbox = malloc(sizeof(JanetMailbox) + sizeof(JanetBuffer) * capacity); | ||||
|     JanetMailbox *mailbox = malloc(sizeof(JanetMailbox) + sizeof(JanetBuffer) * (size_t) capacity); | ||||
|     if (NULL == mailbox) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
|  * which should be filled with Janets. The memory will not be collected until | ||||
|  * janet_tuple_end is called. */ | ||||
| Janet *janet_tuple_begin(int32_t length) { | ||||
|     size_t size = sizeof(JanetTupleHead) + (length * sizeof(Janet)); | ||||
|     size_t size = sizeof(JanetTupleHead) + ((size_t) length * sizeof(Janet)); | ||||
|     JanetTupleHead *head = janet_gcalloc(JANET_MEMORY_TUPLE, size); | ||||
|     head->sm_line = -1; | ||||
|     head->sm_column = -1; | ||||
|   | ||||
| @@ -263,27 +263,36 @@ void janet_var(JanetTable *env, const char *name, Janet val, const char *doc) { | ||||
|  | ||||
| /* Load many cfunctions at once */ | ||||
| void janet_cfuns(JanetTable *env, const char *regprefix, const JanetReg *cfuns) { | ||||
|     uint8_t *longname_buffer = NULL; | ||||
|     size_t prefixlen = 0; | ||||
|     size_t bufsize = 0; | ||||
|     if (NULL != regprefix) { | ||||
|         prefixlen = strlen(regprefix); | ||||
|         bufsize = (prefixlen + 1) * 3; | ||||
|         longname_buffer = malloc(bufsize); | ||||
|         if (NULL == longname_buffer) { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
|         memcpy(longname_buffer, regprefix, prefixlen); | ||||
|         longname_buffer[prefixlen] = '/'; | ||||
|         prefixlen++; | ||||
|     } | ||||
|     while (cfuns->name) { | ||||
|         Janet name = janet_csymbolv(cfuns->name); | ||||
|         Janet longname = name; | ||||
|         if (regprefix) { | ||||
|             int32_t reglen = 0; | ||||
|         Janet name; | ||||
|         if (NULL != regprefix) { | ||||
|             int32_t nmlen = 0; | ||||
|             while (regprefix[reglen]) reglen++; | ||||
|             while (cfuns->name[nmlen]) nmlen++; | ||||
|             int32_t symlen = reglen + 1 + nmlen; | ||||
|             uint8_t *longname_buffer = malloc(symlen); | ||||
|             memcpy(longname_buffer, regprefix, reglen); | ||||
|             longname_buffer[reglen] = '/'; | ||||
|             memcpy(longname_buffer + reglen + 1, cfuns->name, nmlen); | ||||
|             longname = janet_wrap_symbol(janet_symbol(longname_buffer, symlen)); | ||||
|             free(longname_buffer); | ||||
|             memcpy(longname_buffer + prefixlen, cfuns->name, nmlen); | ||||
|             name = janet_wrap_symbol(janet_symbol(longname_buffer, (int32_t) prefixlen + nmlen)); | ||||
|         } else { | ||||
|             name = janet_csymbolv(cfuns->name); | ||||
|         } | ||||
|         Janet fun = janet_wrap_cfunction(cfuns->cfun); | ||||
|         janet_def(env, cfuns->name, fun, cfuns->documentation); | ||||
|         janet_table_put(janet_vm_registry, fun, longname); | ||||
|         janet_table_put(janet_vm_registry, fun, name); | ||||
|         cfuns++; | ||||
|     } | ||||
|     free(longname_buffer); | ||||
| } | ||||
|  | ||||
| /* Abstract type introspection */ | ||||
|   | ||||
| @@ -41,18 +41,14 @@ void *janet_v_grow(void *v, int32_t increment, int32_t itemsize) { | ||||
| /* Convert a buffer to normal allocated memory (forget capacity) */ | ||||
| void *janet_v_flattenmem(void *v, int32_t itemsize) { | ||||
|     int32_t *p; | ||||
|     int32_t sizen; | ||||
|     if (NULL == v) return NULL; | ||||
|     sizen = itemsize * janet_v__cnt(v); | ||||
|     p = malloc(sizen); | ||||
|     size_t size = (size_t) itemsize * janet_v__cnt(v); | ||||
|     p = malloc(size); | ||||
|     if (NULL != p) { | ||||
|         memcpy(p, v, sizen); | ||||
|         memcpy(p, v, size); | ||||
|         return p; | ||||
|     } else { | ||||
|         { | ||||
|             JANET_OUT_OF_MEMORY; | ||||
|         } | ||||
|         return NULL; | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -738,7 +738,7 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in, JanetFiberStatus status) | ||||
|         vm_assert(defindex < func->def->defs_length, "invalid funcdef"); | ||||
|         fd = func->def->defs[defindex]; | ||||
|         elen = fd->environments_length; | ||||
|         fn = janet_gcalloc(JANET_MEMORY_FUNCTION, sizeof(JanetFunction) + (elen * sizeof(JanetFuncEnv *))); | ||||
|         fn = janet_gcalloc(JANET_MEMORY_FUNCTION, sizeof(JanetFunction) + ((size_t) elen * sizeof(JanetFuncEnv *))); | ||||
|         fn->def = fd; | ||||
|         { | ||||
|             int32_t i; | ||||
|   | ||||
| @@ -162,8 +162,8 @@ Janet(janet_wrap_number)(double x) { | ||||
|  | ||||
| void *janet_memalloc_empty(int32_t count) { | ||||
|     int32_t i; | ||||
|     void *mem = malloc(count * sizeof(JanetKV)); | ||||
|     janet_vm_next_collection += count * sizeof(JanetKV); | ||||
|     void *mem = malloc((size_t) count * sizeof(JanetKV)); | ||||
|     janet_vm_next_collection += (size_t) count * sizeof(JanetKV); | ||||
|     if (NULL == mem) { | ||||
|         JANET_OUT_OF_MEMORY; | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose