diff options
author | Stefan Sperling <stsp@cvs.openbsd.org> | 2009-12-14 21:15:56 +0000 |
---|---|---|
committer | Stefan Sperling <stsp@cvs.openbsd.org> | 2009-12-14 21:15:56 +0000 |
commit | c1d04e5481ab2a45629ba5f2d1cb29e7f6d0fe8a (patch) | |
tree | 08176a66ee32d1fbb10b143f4baf8c84cd030caa /gnu/usr.bin | |
parent | 6e4fc502035d31ccb93a55c098c5af187f7a2458 (diff) |
Fix "cvs [update aborted]: out of memory; can not reallocate 5242880 bytes"
when checking out xenocara from a server running OpenBSD/amd64.
While processing RCS deltas, don't allocate twice as much memory as
needed when copying a line vector to a vector which has less lines.
Also, when switching back from a branch to trunk while searching an
RCS file for a revision, free the trunklines vector immediately after
lines saved in it have been copied back into the currentlines vector.
Somehow, these two changes together make the problem go away.
ok tobias@, "this has been a serious annoyance" sthen@, "sure" deraadt@
Diffstat (limited to 'gnu/usr.bin')
-rw-r--r-- | gnu/usr.bin/cvs/src/rcs.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/gnu/usr.bin/cvs/src/rcs.c b/gnu/usr.bin/cvs/src/rcs.c index 4260952e10e..6b003353e51 100644 --- a/gnu/usr.bin/cvs/src/rcs.c +++ b/gnu/usr.bin/cvs/src/rcs.c @@ -6758,10 +6758,7 @@ linevector_copy (to, from) } if (from->nlines > to->lines_alloced) { - if (to->lines_alloced == 0) - to->lines_alloced = 10; - while (from->nlines > to->lines_alloced) - to->lines_alloced *= 2; + to->lines_alloced = from->nlines; to->vector = (struct line **) xrealloc (to->vector, to->lines_alloced * sizeof (*to->vector)); } @@ -7184,6 +7181,8 @@ RCS_deltas (rcs, fp, rcsbuf, version, op, text, len, log, loglen) vers = trunk_vers; next = vers->next; linevector_copy (&curlines, &trunklines); + linevector_free (&trunklines); + linevector_init (&trunklines); } } else |