blkdiscard: avoid asserting when passed a bsd disklabel raw device
PR#57856 shows when using blkdiscard on eg, /dev/ld0 it asserts because '0' is not between 'a' and 'p'. switch this to using DISKPART() on the returned st_rdev, so it works on 'ld0c' or 'ld0' (rawpart=2.)
This commit is contained in:
parent
2bdf8003c6
commit
4bcb661e85
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: blkdiscard.8,v 1.2 2022/10/15 21:53:21 andvar Exp $
|
||||
.\" $NetBSD: blkdiscard.8,v 1.3 2024/01/25 02:42:17 mrg Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2022 Matthew R. Green
|
||||
.\" All rights reserved.
|
||||
|
@ -24,7 +24,7 @@
|
|||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd February 6, 2022
|
||||
.Dd January 13, 2024
|
||||
.Dt BLKDISCARD 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
@ -156,7 +156,7 @@ The
|
|||
.Nm
|
||||
command was written by
|
||||
.An Matthew R. Green
|
||||
.Aq mrg@eterna.com.au .
|
||||
.Aq mrg@eterna23.net .
|
||||
.Sh BUGS
|
||||
The secure erase functionality of the
|
||||
.Fl s
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* $NetBSD: blkdiscard.c,v 1.2 2024/01/25 02:06:56 mrg Exp $ */
|
||||
/* $NetBSD: blkdiscard.c,v 1.3 2024/01/25 02:42:17 mrg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2019, 2020, 2022 Matthew R. Green
|
||||
* Copyright (c) 2019, 2020, 2022, 2024 Matthew R. Green
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -45,7 +45,6 @@
|
|||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
static bool secure = false;
|
||||
|
@ -53,7 +52,7 @@ static bool zeroout = false;
|
|||
static char *zeros = NULL;
|
||||
static unsigned ttywidth = 80;
|
||||
|
||||
#define FDISCARD_VERSION 20220206u
|
||||
#define FDISCARD_VERSION 20240113u
|
||||
|
||||
static void __dead
|
||||
usage(const char* msg)
|
||||
|
@ -105,6 +104,7 @@ main(int argc, char *argv[])
|
|||
int64_t val;
|
||||
int i;
|
||||
bool verbose = false;
|
||||
struct stat sb;
|
||||
|
||||
/* Default /sbin/blkdiscard to be "run" */
|
||||
bool norun = strcmp(getprogname(), "blkdiscard") != 0;
|
||||
|
@ -176,6 +176,7 @@ main(int argc, char *argv[])
|
|||
|
||||
if (size == 0) {
|
||||
struct dkwedge_info dkw;
|
||||
|
||||
if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == 0) {
|
||||
size = dkw.dkw_size * DEV_BSIZE;
|
||||
if (verbose)
|
||||
|
@ -184,24 +185,20 @@ main(int argc, char *argv[])
|
|||
}
|
||||
}
|
||||
|
||||
if (size == 0) {
|
||||
if (size == 0 && fstat(fd, &sb) != -1) {
|
||||
struct disklabel dl;
|
||||
|
||||
if (ioctl(fd, DIOCGDINFO, &dl) != -1) {
|
||||
char partchar = name[strlen(name)-1];
|
||||
assert(partchar >= 'a' && partchar <= 'p');
|
||||
int part = partchar - 'a';
|
||||
unsigned part = DISKPART(sb.st_rdev);
|
||||
|
||||
size = (uint64_t)dl.d_partitions[part].p_size *
|
||||
dl.d_secsize;
|
||||
if (verbose)
|
||||
printf("%s: disklabel size is %lld\n", name,
|
||||
(long long)size);
|
||||
printf("%s: partition %u disklabel size is"
|
||||
" %lld\n", name, part, (long long)size);
|
||||
}
|
||||
}
|
||||
|
||||
if (size == 0) {
|
||||
struct stat sb;
|
||||
if (fstat(fd, &sb) != -1) {
|
||||
if (size == 0) {
|
||||
size = sb.st_size;
|
||||
if (verbose)
|
||||
printf("%s: stat size is %lld\n", name,
|
||||
|
|
Loading…
Reference in New Issue