5fe279baa642eaee9b0f292a6a171dcbac1cf350 galt Thu Dec 16 00:30:55 2021 -0800 Fixing annoying message in needMem when user passes a signed int that has overflowed. Recent example came in liftOver question from user when they were running on a 3GB file. diff --git src/lib/memalloc.c src/lib/memalloc.c index 128824c..bdff614 100644 --- src/lib/memalloc.c +++ src/lib/memalloc.c @@ -184,30 +184,34 @@ { void *v; v = needHugeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } #define NEEDMEM_LIMIT 500000000 void *needMem(size_t size) /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ { void *pt; + +if (size >= 0x8000000000000000) // caused by overflowed signed int getting sign-extended + size += 4294967296; + if (size == 0 || size > NEEDMEM_LIMIT) errAbort("needMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)NEEDMEM_LIMIT); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); memset(pt, 0, size); memAlloced += size; return pt; } void *needMoreMem(void *old, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */