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