From owner-freebsd-bugs Sun Feb 4 16: 0:24 2001 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 37A0337B503 for ; Sun, 4 Feb 2001 16:00:02 -0800 (PST) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.1/8.11.1) id f15002o87767; Sun, 4 Feb 2001 16:00:02 -0800 (PST) (envelope-from gnats) Received: from miraculix.thgwf.de (miraculix.thgwf.de [141.41.62.2]) by hub.freebsd.org (Postfix) with ESMTP id 95B8237B401 for ; Sun, 4 Feb 2001 15:54:20 -0800 (PST) Received: (from uucp@localhost) by miraculix.thgwf.de (8.9.3/8.9.3) with UUCP id AAA27972 for FreeBSD-gnats-submit@freebsd.org; Mon, 5 Feb 2001 00:54:17 +0100 (CET) (envelope-from mb@bagheera.dyndns.org) Received: (from mb@localhost) by bagheera.dyndns.org (8.11.1/8.11.1) id f14NrX609141; Mon, 5 Feb 2001 00:53:33 +0100 (CET) (envelope-from mb) Message-Id: <200102042353.f14NrX609141@bagheera.dyndns.org> Date: Mon, 5 Feb 2001 00:53:33 +0100 (CET) From: Martin Butkus Reply-To: mb@bagheera.thgwf.de To: FreeBSD-gnats-submit@freebsd.org X-Send-Pr-Version: 3.2 Subject: bin/24857: File descriptor leak and frequent crashes of rpc.rstatd [PATCH] Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 24857 >Category: bin >Synopsis: File descriptor leak and frequent crashes of rpc.rstatd [PATCH] >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Feb 04 16:00:01 PST 2001 >Closed-Date: >Last-Modified: >Originator: Martin Butkus >Release: FreeBSD 4.2-STABLE i386 >Organization: TU Braunschweig, Germany >Environment: - several i386 boxen running a recently cvsupped FreeBSD 4.2-STABLE: rstat_proc.c: $FreeBSD: src/libexec/rpc.rstatd/rstat_proc.c,v 1.14 1999/08/28 00:09:54 peter Exp $ rstatd.c: $FreeBSD: src/libexec/rpc.rstatd/rstatd.c,v 1.8 1999/08/28 00:09:54 peter Exp $ - an i386 server running an old 3.5-STABLE: rstat_proc.c: $FreeBSD: src/libexec/rpc.rstatd/rstat_proc.c,v 1.14 1999/08/28 00:09:54 peter Exp $ rstatd.c: $FreeBSD: src/libexec/rpc.rstatd/rstatd.c,v 1.7.2.1 1999/08/29 15:03:49 peter Exp $ >Description: I run rpc.rstatd on several FreeBSD boxes. A monitoring process polls every machine every five minutes. Running rstatd from inetd gave me bogus results (network activity was reported way too high, etc.) so I resorted to running rstatd standalone. However, when run standalone, it crashed frequently, and I also discovered a file descriptor leak. I have observed that: 1) rpc.rstatd opens /dev/mem and /dev/kmem multiple times until running out of file descriptors. 2) rpc.rstatd often crashes within 24 hours I have found and fixed the file descriptor leak but the crashes continued. I have then backtraced a core dump and found that updatestat() had been called from within itself. I figured there was a timing problem, i.e. updatestat() was running while there was still an alarm pending. Since updatestat() is the signal handler for SIGALRM, this triggered the recursive call of updatestat(). I have therefore added an "alarm(0)" call at the beginning of updatestat() in order to clear any pending alarms. With these two modification, rpc.rstatd has been running on all my machines flawlessly and continuously for more than a week now. >How-To-Repeat: This is difficult because on my network, rstatd is polled frequently (every 5 minutes) by a monitoring program. I don't know if this triggers the bug(s). It could well be possible. The following actions have triggered the bug at my site: ad 1) run rpc.rstatd standalone # /usr/libexec/rpc.rstatd wait long enough :(. For me, an rstatd crashed after about 24 hours. ad 2) run rpc.rstatd standalone # /usr/libexec/rpc.rstatd Wait a few minutes, then do an # fstat and see rstatd having opened /dev/mem several times. Wait a few hours more and watch the file descriptor table run full :(. >Fix: This patch (against rstat_proc.c ver 1.14) has made rstatd run stable for me: --- libexec/rpc.rstatd/rstat_proc.c.orig Tue Jan 16 16:27:09 2001 +++ libexec/rpc.rstatd/rstat_proc.c Sat Jan 20 14:47:32 2001 @@ -99,7 +99,7 @@ void updatestat(); static stat_is_init = 0; -static kvm_t *kd; +static kvm_t *kd = NULL; static int cp_time_xlat[RSTAT_CPUSTATES] = { CP_USER, CP_NICE, CP_SYS, CP_IDLE }; @@ -203,15 +203,20 @@ #ifdef DEBUG fprintf(stderr, "about to closedown\n"); #endif - if (from_inetd) + if (from_inetd) { + kvm_close(kd); exit(0); + } else { stat_is_init = 0; return; } } + + alarm(0); sincelastreq++; + mib[0] = CTL_KERN; mib[1] = KERN_CLOCKRATE; len = sizeof clockrate; @@ -315,7 +320,9 @@ int en; - if ((kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL) { + + if (kd == NULL && + (kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL) { syslog(LOG_ERR, "rpc.rstatd, %s", errbuf); exit(1); } >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message