svn commit: r344307 - head/sys/geom
Mark Johnston
markj at FreeBSD.org
Tue Feb 19 21:33:03 UTC 2019
Author: markj
Date: Tue Feb 19 21:33:02 2019
New Revision: 344307
URL: https://svnweb.freebsd.org/changeset/base/344307
Log:
Limit the number of entries allocated for a REPORT_ZONES command.
The DIOCGETZONE ioctl can be used to fetch the zone list of an SMR
drive, and the caller specifies the number of entries it wants to fetch.
Clamp the caller's request to a sane limit so that a user cannot attempt
large allocations. Callers already need to invoke the ioctl multiple
times to fetch the full list in general, so there's no harm in limiting
the number of entries returned.
Fix style while here.
admbug: 807
Reported by: Ilja Van Sprundel <ivansprundel at ioactive.com>
Reviewed by: asomers, ken
Tested by: ken
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D19249
Modified:
head/sys/geom/geom_dev.c
Modified: head/sys/geom/geom_dev.c
==============================================================================
--- head/sys/geom/geom_dev.c Tue Feb 19 21:27:30 2019 (r344306)
+++ head/sys/geom/geom_dev.c Tue Feb 19 21:33:02 2019 (r344307)
@@ -677,8 +677,10 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data
alloc_size = 0;
if (zone_args->zone_cmd == DISK_ZONE_REPORT_ZONES) {
-
rep = &zone_args->zone_params.report;
+#define MAXENTRIES (MAXPHYS / sizeof(struct disk_zone_rep_entry))
+ if (rep->entries_allocated > MAXENTRIES)
+ rep->entries_allocated = MAXENTRIES;
alloc_size = rep->entries_allocated *
sizeof(struct disk_zone_rep_entry);
if (alloc_size != 0)
@@ -688,15 +690,11 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data
rep->entries = new_entries;
}
error = g_io_zonecmd(zone_args, cp);
- if ((zone_args->zone_cmd == DISK_ZONE_REPORT_ZONES)
- && (alloc_size != 0)
- && (error == 0)) {
+ if (zone_args->zone_cmd == DISK_ZONE_REPORT_ZONES &&
+ alloc_size != 0 && error == 0)
error = copyout(new_entries, old_entries, alloc_size);
- }
- if ((old_entries != NULL)
- && (rep != NULL))
+ if (old_entries != NULL && rep != NULL)
rep->entries = old_entries;
-
if (new_entries != NULL)
g_free(new_entries);
break;
More information about the svn-src-all
mailing list