return r;
}
+/* this was solv_realloc2(old, len, size), but we now overshoot
+ * for huge len sizes */
+void *
+solv_extend_realloc(void *old, size_t len, size_t size, size_t block)
+{
+ size_t xblock = (block + 1) << 5;
+ if (len >= xblock && xblock)
+ {
+ xblock <<= 1;
+ while (len >= xblock && xblock)
+ xblock <<= 1;
+ if (xblock)
+ {
+ size_t nlen;
+ xblock = (xblock >> 5) - 1;
+ nlen = (len + xblock) & ~xblock;
+ if (nlen > len)
+ len = nlen;
+ }
+ }
+ return solv_realloc2(old, len, size);
+}
+
void *
solv_free(void *mem)
{
extern void *solv_calloc(size_t, size_t);
extern void *solv_realloc(void *, size_t);
extern void *solv_realloc2(void *, size_t, size_t);
+extern void *solv_extend_realloc(void *, size_t, size_t, size_t);
extern void *solv_free(void *);
extern char *solv_strdup(const char *);
extern void solv_oom(size_t, size_t);
if (nmemb == 1)
{
if ((len & block) == 0)
- buf = solv_realloc2(buf, len + (1 + block), size);
+ buf = solv_extend_realloc(buf, len + (1 + block), size, block);
}
else
{
if (((len - 1) | block) != ((len + nmemb - 1) | block))
- buf = solv_realloc2(buf, (len + (nmemb + block)) & ~block, size);
+ buf = solv_extend_realloc(buf, (len + (nmemb + block)) & ~block, size, block);
}
return buf;
}
static inline void *solv_extend_resize(void *buf, size_t len, size_t size, size_t block)
{
if (len)
- buf = solv_realloc2(buf, (len + block) & ~block, size);
+ buf = solv_extend_realloc(buf, (len + block) & ~block, size, block);
return buf;
}
void *buf;
if (!len)
return 0;
- buf = solv_malloc2((len + block) & ~block, size);
+ buf = solv_extend_realloc((void *)0, (len + block) & ~block, size, block);
memset(buf, 0, ((len + block) & ~block) * size);
return buf;
}