Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Dec 1999 20:40:48 +0100 (CET)
From:      assar@sics.se
To:        FreeBSD-gnats-submit@freebsd.org
Cc:        assar@sics.se
Subject:   kern/15690: savecore fails to work when it doesn't find the block-device
Message-ID:  <199912251940.UAA00692@hunahpu.sics.se>

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

>Number:         15690
>Category:       kern
>Synopsis:       savecore fails to work when it doesn't find the block-device
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Dec 25 11:50:00 PST 1999
>Closed-Date:
>Last-Modified:
>Originator:     Assar Westerlund
>Release:        FreeBSD 4.0-19991225-CURRENT i386
>Organization:
none
>Environment:

-current on i386

>Description:

savecore tries to open the raw device with a fallback to the block device but
this is done wrong and it ends up closing the block device that's used
later.

Dec 25 19:59:02 hunahpu savecore: /dev/rrad0s1b: No such file or directory; using block device

but since we don't have any block devices anymore we might just remove
that fallback.

>How-To-Repeat:

crash and run savecore

>Fix:

Index: savecore.c
===================================================================
RCS file: /home/ncvs/src/sbin/savecore/savecore.c,v
retrieving revision 1.28
diff -u -w -r1.28 savecore.c
--- savecore.c	1999/12/21 07:41:07	1.28
+++ savecore.c	1999/12/25 19:36:31
@@ -134,7 +134,6 @@
 void	 Lseek __P((int, off_t, int));
 int	 Open __P((const char *, int rw));
 int	 Read __P((int, void *, int));
-char	*rawname __P((char *s));
 void	 save_core __P((void));
 void	 usage __P((void));
 void	 Write __P((int, void *, int));
@@ -340,7 +339,7 @@
 {
 	register FILE *fp;
 	register int bounds, ifd, nr, nw, ofd;
-	char *rawp, path[MAXPATHLEN];
+	char path[MAXPATHLEN];
 	mode_t oumask;
 
 	/*
@@ -379,15 +378,8 @@
 		ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
 	(void)umask(oumask);
 
-	/* Open the raw device. */
-	rawp = rawname(ddname);
-	if ((ifd = open(rawp, O_RDONLY)) == -1) {
-		syslog(LOG_WARNING, "%s: %m; using block device", rawp);
-		ifd = dumpfd;
-	}
-
 	/* Seek to the start of the core. */
-	Lseek(ifd, (off_t)dumplo, L_SET);
+	Lseek(dumpfd, (off_t)dumplo, L_SET);
 
 	/* Copy the core file. */
 	syslog(LOG_NOTICE, "writing %score to %s",
@@ -395,13 +387,13 @@
 	for (; dumpsize > 0; dumpsize -= nr) {
 		(void)printf("%6dK\r", dumpsize / 1024);
 		(void)fflush(stdout);
-		nr = read(ifd, buf, MIN(dumpsize, sizeof(buf)));
+		nr = read(dumpfd, buf, MIN(dumpsize, sizeof(buf)));
 		if (nr <= 0) {
 			if (nr == 0)
 				syslog(LOG_WARNING,
 				    "WARNING: EOF on dump device");
 			else
-				syslog(LOG_ERR, "%s: %m", rawp);
+				syslog(LOG_ERR, "%s: %m", ddname);
 			goto err2;
 		}
 		if (compress)
@@ -417,7 +409,6 @@
 			exit(1);
 		}
 	}
-	(void)close(ifd);
 	if (compress)
 		(void)fclose(fp);
 	else
@@ -497,25 +488,6 @@
 	closedir(dfd);
 	syslog(LOG_ERR, "can't find device %d/%d", major(dev), minor(dev));
 	exit(1);
-}
-
-char *
-rawname(s)
-	char *s;
-{
-	char *sl, name[MAXPATHLEN];
-
-	if ((sl = rindex(s, '/')) == NULL || sl[1] == '0') {
-		syslog(LOG_ERR,
-		    "can't make raw dump device name from %s", s);
-		return (s);
-	}
-	snprintf(name, sizeof(name), "%.*s/r%s", (int)(sl - s), s, sl + 1);
-	if ((sl = strdup(name)) == NULL) {
-		syslog(LOG_ERR, "%s", strerror(errno));
-		exit(1);
-	}
-	return (sl);
 }
 
 int

and if this isn't the right way we should at least avoid closing the
file, with this patch:

Index: savecore.c
===================================================================
RCS file: /home/ncvs/src/sbin/savecore/savecore.c,v
retrieving revision 1.28
diff -u -w -u -w -r1.28 savecore.c
--- savecore.c	1999/12/21 07:41:07	1.28
+++ savecore.c	1999/12/25 19:37:04
@@ -383,7 +383,7 @@
 	rawp = rawname(ddname);
 	if ((ifd = open(rawp, O_RDONLY)) == -1) {
 		syslog(LOG_WARNING, "%s: %m; using block device", rawp);
-		ifd = dumpfd;
+		ifd = dup(dumpfd);
 	}
 
 	/* Seek to the start of the core. */

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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