Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Jan 2003 17:20:04 -0800 (PST)
From:      David Schultz <dschultz@uclink.Berkeley.EDU>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: i386/45391: /usr/bin/cmp coredumps while reading a faulty CD-R
Message-ID:  <200301250120.h0P1K4fg071431@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/45391; it has been noted by GNATS.

From: David Schultz <dschultz@uclink.Berkeley.EDU>
To: Cinek <cinekcvs@gmx.net>
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: i386/45391: /usr/bin/cmp coredumps while reading a faulty CD-R
Date: Fri, 24 Jan 2003 17:17:13 -0800

 > >Number:         45391
 > >Category:       i386
 > >Synopsis:       /usr/bin/cmp coredumps while reading a faulty CD-R
 ...
 > >Description:
 > When using the command /usr/bin/cmp from the default
 > FreeBSD-4.7 package, it is possible to produce a coredump.
 > It seems, there is a problem in handling errors while
 > reading faulty files. It happened to me while I was comparing
 > two files which I suspected to be dupes on my CD-Rs.
 
 This is not the first time this buglet has confused someone, so
 here's a simple fix.  The diff is against -CURRENT, but it can be
 applied to -STABLE as well.
 
 
 Index: usr.bin/cmp/regular.c
 ===================================================================
 RCS file: /home/ncvs/src/usr.bin/cmp/regular.c,v
 retrieving revision 1.17
 diff -u -u -r1.17 regular.c
 --- usr.bin/cmp/regular.c	2002/07/28 15:13:17	1.17
 +++ usr.bin/cmp/regular.c	2003/01/25 01:14:02
 @@ -45,7 +45,9 @@
  #include <sys/stat.h>
  
  #include <err.h>
 +#include <errno.h>
  #include <limits.h>
 +#include <signal.h>
  #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
 @@ -54,6 +56,7 @@
  #include "extern.h"
  
  static u_char *remmap(u_char *, int, off_t);
 +static void segv_handler(int);
  #define MMAP_CHUNK (8*1024*1024)
  
  #define ROUNDPAGE(i) ((i) & ~pagemask)
 @@ -67,6 +70,7 @@
  	int dfound;
  	off_t pagemask, off1, off2;
  	size_t pagesize;
 +	struct sigaction act, oact;
  
  	if (skip1 > len1)
  		eofmsg(file1);
 @@ -78,6 +82,12 @@
  	if (sflag && len1 != len2)
  		exit(DIFF_EXIT);
  
 +	sigemptyset(&act.sa_mask);
 +	act.sa_flags = SA_NODEFER;
 +	act.sa_handler = segv_handler;
 +	if (sigaction(SIGSEGV, &act, &oact))
 +		err(ERR_EXIT, "sigaction");
 +
  	pagesize = getpagesize();
  	pagemask = (off_t)pagesize - 1;
  	off1 = ROUNDPAGE(skip1);
 @@ -138,6 +148,9 @@
  	munmap(m1, MMAP_CHUNK);
  	munmap(m2, MMAP_CHUNK);
  
 +	if (sigaction(SIGSEGV, &oact, NULL))
 +		err(ERR_EXIT, "sigaction");
 +
  	if (len1 != len2)
  		eofmsg (len1 > len2 ? file2 : file1);
  	if (dfound)
 @@ -154,4 +167,10 @@
  		return (NULL);
  	madvise(mem, MMAP_CHUNK, MADV_SEQUENTIAL);
  	return (mem);
 +}
 +
 +static void
 +segv_handler(int sig) {
 +
 +	errc(ERR_EXIT, EIO, "(caught SIGSEGV)");
  }

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?200301250120.h0P1K4fg071431>