Skip site navigation (1)Skip section navigation (2)
Date:      13 Sep 1997 18:14:44 -0000
From:      m.koster@webcrawler.com
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   bin/4526: realloc causes excessive swapping (more info for bin/4524)
Message-ID:  <19970913181444.12748.qmail@mail.webcrawler.com>
Resent-Message-ID: <199709131820.LAA18566@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help


>Number:         4526
>Category:       bin
>Synopsis:       realloc causes excessive swapping (more info for bin/4524)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Sep 13 11:20:01 PDT 1997
>Last-Modified:
>Originator:     Martijn Koster
>Organization:
Excite, Inc.
>Release:        FreeBSD 2.2-STABLE i386
>Environment:

	FreeBSD 2.2-STABLE #0: Wed Sep 10 12:00:23 PDT 1997

>Description:

        This provides more information for bin/4524

	Repeatedly calling realloc causes much more memory to be used
        then you'd expect. For example, when procmail tried reading an
        8M message, this was sufficient to run a 64M (128M swap) machine
        doing nothing else out of swap (and into the ground :-)

>How-To-Repeat:

        This code reproduced the problem outside procmail:

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>

 int
 main(int argc, char* argv[])
 {
    size_t size = 0;
    char *p = NULL;
    int max = 8404992;

    if (argc > 2) {
        fprintf(stderr, "Usage: %s maxmem\n", argv[0]);
        exit(-1);
    }
    if (argc > 1)
        max = atoi(argv[1]);

    while(1) {

        size += 16384;
        if (size > max)
            break;

        fprintf(stderr, "realloc(%u)\n", size);
        if ((p = realloc(p, size)) == NULL) {
            fprintf(stderr, "out of memory\n");
            exit(-1);
        }
    }

    {
        int c;
        printf("done. press return to quit\n");
        read(0, &c, 1);
    }
 }

>Fix:
	
	Recompiling the code with the malloc.c from freebsd-current

        * $Id: malloc.c,v 1.32 1997/08/31 05:59:39 phk Exp $

        fixed things (as did recompiling libc with that malloc.c)
        Now the program is killed after getting much further than before;
        (I assume when it hits its resource limits) instead of
        impacting the machine.

        This fix was previously reported by jfieber@indiana.edu back in June

>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19970913181444.12748.qmail>