NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/53217: -current: dumping to wedges on GPT disks broken



The following reply was made to PR kern/53217; it has been noted by GNATS.

From: mlelstv%serpens.de@localhost (Michael van Elst)
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: kern/53217: -current: dumping to wedges on GPT disks broken
Date: Sat, 28 Apr 2018 15:02:28 -0000 (UTC)

 kardel%netbsd.org@localhost writes:
 
 >>Description:
 >	dumping on a swap wedge from a GPT partitioned disk fails with
 >	dump: device bad
 
 >>Fix:
 
 Maybe this:
 
 Index: sys/dev/dksubr.c
 ===================================================================
 RCS file: /cvsroot/src/sys/dev/dksubr.c,v
 retrieving revision 1.101
 diff -u -r1.101 dksubr.c
 --- sys/dev/dksubr.c	4 Dec 2017 22:15:52 -0000	1.101
 +++ sys/dev/dksubr.c	28 Apr 2018 14:55:39 -0000
 @@ -762,10 +762,11 @@
      daddr_t blkno, void *vav, size_t size)
  {
  	const struct dkdriver *dkd = dksc->sc_dkdev.dk_driver;
 +	struct disk_geom *dg = &dksc->sc_dkdev.dk_geom;
  	char *va = vav;
  	struct disklabel *lp;
  	struct partition *p;
 -	int part, towrt, nsects, sectoff, maxblkcnt, nblk;
 +	int part, towrt, maxblkcnt, nblk;
  	int maxxfer, rv = 0;
  
  	/*
 @@ -804,23 +805,44 @@
  	blkno = dbtob(blkno) / lp->d_secsize;   /* blkno in secsize units */
  
  	p = &lp->d_partitions[part];
 -	if (p->p_fstype != FS_SWAP) {
 -		DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__,
 -		    p->p_fstype));
 -		return ENXIO;
 -	}
 -	nsects = p->p_size;
 -	sectoff = p->p_offset;
 +	if (part == RAW_PART) {
 +		if (p->p_fstype != FS_UNUSED) {
 +			DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__,
 +			    p->p_fstype));
 +			return ENXIO;
 +		}
 +		/* Check wether dump goes to a wedge */
 +		if (dksc->sc_dkdev.dk_nwedges == 0) {
 +			DPRINTF(DKDB_DUMP, ("%s: dump to raw\n", __func__));
 +			return ENXIO;
 +		}
 +		/* Check transfer bounds against media size */
 +		if (blkno < 0 || (blkno + towrt) > dg->dg_secperunit) {
 +			DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, "
 +			    "nsects=%jd\n", __func__, (intmax_t)blkno, towrt, dg->dg_secperunit));
 +			return EINVAL;
 +		}
 +	} else {
 +		int nsects, sectoff;
  
 -	/* Check transfer bounds against partition size. */
 -	if ((blkno < 0) || ((blkno + towrt) > nsects)) {
 -		DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, "
 -		    "nsects=%d\n", __func__, (intmax_t)blkno, towrt, nsects));
 -		return EINVAL;
 -	}
 +		if (p->p_fstype != FS_SWAP) {
 +			DPRINTF(DKDB_DUMP, ("%s: bad fstype %d\n", __func__,
 +			    p->p_fstype));
 +			return ENXIO;
 +		}
 +		nsects = p->p_size;
 +		sectoff = p->p_offset;
  
 -	/* Offset block number to start of partition. */
 -	blkno += sectoff;
 +		/* Check transfer bounds against partition size. */
 +		if ((blkno < 0) || ((blkno + towrt) > nsects)) {
 +			DPRINTF(DKDB_DUMP, ("%s: out of bounds blkno=%jd, towrt=%d, "
 +			    "nsects=%d\n", __func__, (intmax_t)blkno, towrt, nsects));
 +			return EINVAL;
 +		}
 +
 +		/* Offset block number to start of partition. */
 +		blkno += sectoff;
 +	}
  
  	/* Start dumping and return when done. */
  	maxblkcnt = howmany(maxxfer, lp->d_secsize);
 Index: sys/dev/dkwedge/dk.c
 ===================================================================
 RCS file: /cvsroot/src/sys/dev/dkwedge/dk.c,v
 retrieving revision 1.96
 diff -u -r1.96 dk.c
 --- sys/dev/dkwedge/dk.c	5 Mar 2017 23:07:12 -0000	1.96
 +++ sys/dev/dkwedge/dk.c	28 Apr 2018 14:55:39 -0000
 @@ -1613,7 +1613,7 @@
  		rv = EINVAL;
  		goto out;
  	}
 -	if (blkno + size / DEV_BSIZE > sc->sc_size) {
 +	if (blkno < 0 || blkno + size / DEV_BSIZE > sc->sc_size) {
  		printf("%s: blkno (%" PRIu64 ") + size / DEV_BSIZE (%zu) > "
  		    "sc->sc_size (%" PRIu64 ")\n", __func__, blkno,
  		    size / DEV_BSIZE, sc->sc_size);
 
 
 -- 
 -- 
                                 Michael van Elst
 Internet: mlelstv%serpens.de@localhost
                                 "A potential Snark may lurk in every tree."
 


Home | Main Index | Thread Index | Old Index