diff --git a/src/sds.c b/src/sds.c index b6c2aaf3e..5dc12bf95 100644 --- a/src/sds.c +++ b/src/sds.c @@ -116,7 +116,11 @@ sds sdsMakeRoomFor(sds s, size_t addlen) { if (free >= addlen) return s; len = sdslen(s); sh = (void*) (s-(sizeof(struct sdshdr))); - newlen = (len+addlen)*2; + newlen = (len+addlen); + if (newlen < SDS_MAX_PREALLOC) + newlen *= 2; + else + newlen += SDS_MAX_PREALLOC; newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1); #ifdef SDS_ABORT_ON_OOM if (newsh == NULL) sdsOomAbort(); diff --git a/src/sds.h b/src/sds.h index ee336d1de..b00551b41 100644 --- a/src/sds.h +++ b/src/sds.h @@ -31,6 +31,8 @@ #ifndef __SDS_H #define __SDS_H +#define SDS_MAX_PREALLOC (1024*1024) + #include #include