Module Name: src
Committed By: christos
Date: Tue Dec 1 23:29:07 UTC 2015
Modified Files:
src/sbin/gpt: add.c biosboot.c gpt.c gpt.h gpt_uuid.c gpt_uuid.h
label.c show.c
Log Message:
merge command line parsers and check all memory allocations.
To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sbin/gpt/add.c
cvs rdiff -u -r1.17 -r1.18 src/sbin/gpt/biosboot.c
cvs rdiff -u -r1.51 -r1.52 src/sbin/gpt/gpt.c
cvs rdiff -u -r1.25 -r1.26 src/sbin/gpt/gpt.h src/sbin/gpt/show.c
cvs rdiff -u -r1.10 -r1.11 src/sbin/gpt/gpt_uuid.c
cvs rdiff -u -r1.4 -r1.5 src/sbin/gpt/gpt_uuid.h
cvs rdiff -u -r1.22 -r1.23 src/sbin/gpt/label.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/gpt/add.c
diff -u src/sbin/gpt/add.c:1.33 src/sbin/gpt/add.c:1.34
--- src/sbin/gpt/add.c:1.33 Tue Dec 1 14:25:24 2015
+++ src/sbin/gpt/add.c Tue Dec 1 18:29:07 2015
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: add.c,v 1.33 2015/12/01 19:25:24 christos Exp $");
+__RCSID("$NetBSD: add.c,v 1.34 2015/12/01 23:29:07 christos Exp $");
#endif
#include <sys/types.h>
@@ -152,28 +152,19 @@ static int
cmd_add(gpt_t gpt, int argc, char *argv[])
{
int ch;
- int64_t human_num;
while ((ch = getopt(argc, argv, GPT_AIS "bl:t:")) != -1) {
switch(ch) {
case 'b':
- if (block > 0)
- return usage();
- if (dehumanize_number(optarg, &human_num) < 0)
- return usage();
- block = human_num;
- if (block < 1)
+ if (gpt_human_get(&block) == -1)
return usage();
break;
case 'l':
- if (name != NULL)
+ if (gpt_name_get(gpt, &name) == -1)
return usage();
- name = (uint8_t *)strdup(optarg);
break;
case 't':
- if (!gpt_uuid_is_nil(type))
- return usage();
- if (gpt_uuid_parse(optarg, type) != 0)
+ if (gpt_uuid_get(gpt, &type) == -1)
return usage();
break;
default:
@@ -188,9 +179,8 @@ cmd_add(gpt_t gpt, int argc, char *argv[
return usage();
/* Create NetBSD FFS partitions by default. */
- if (gpt_uuid_is_nil(type)) {
+ if (gpt_uuid_is_nil(type))
gpt_uuid_create(GPT_TYPE_NETBSD_FFS, type, NULL, 0);
- }
if (optind != argc)
return usage();
Index: src/sbin/gpt/biosboot.c
diff -u src/sbin/gpt/biosboot.c:1.17 src/sbin/gpt/biosboot.c:1.18
--- src/sbin/gpt/biosboot.c:1.17 Tue Dec 1 11:32:19 2015
+++ src/sbin/gpt/biosboot.c Tue Dec 1 18:29:07 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: biosboot.c,v 1.17 2015/12/01 16:32:19 christos Exp $ */
+/* $NetBSD: biosboot.c,v 1.18 2015/12/01 23:29:07 christos Exp $ */
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#ifdef __RCSID
-__RCSID("$NetBSD: biosboot.c,v 1.17 2015/12/01 16:32:19 christos Exp $");
+__RCSID("$NetBSD: biosboot.c,v 1.18 2015/12/01 23:29:07 christos Exp $");
#endif
#include <sys/stat.h>
@@ -252,34 +252,23 @@ cmd_biosboot(gpt_t gpt, int argc, char *
#ifdef DIOCGWEDGEINFO
struct dkwedge_info dkw;
#endif
- char *dev, *p;
+ char *dev;
int ch;
gpt_t ngpt = gpt;
while ((ch = getopt(argc, argv, "c:i:L:")) != -1) {
switch(ch) {
case 'c':
- if (bootpath != NULL)
- usage();
- if ((bootpath = strdup(optarg)) == NULL) {
- gpt_warn(gpt, "strdup failed");
- return -1;
- }
+ if (gpt_name_get(gpt, &bootpath) == -1)
+ return usage();
break;
case 'i':
- if (entry > 0)
- usage();
- entry = strtoul(optarg, &p, 10);
- if (*p != 0 || entry < 1)
+ if (gpt_entry_get(&entry) == -1)
return usage();
break;
case 'L':
- if (label != NULL)
+ if (gpt_name_get(gpt, &label) == -1)
return usage();
- if ((label = (uint8_t *)strdup(optarg)) == NULL) {
- gpt_warn(gpt, "strdup failed");
- return -1;
- }
break;
default:
return usage();
Index: src/sbin/gpt/gpt.c
diff -u src/sbin/gpt/gpt.c:1.51 src/sbin/gpt/gpt.c:1.52
--- src/sbin/gpt/gpt.c:1.51 Tue Dec 1 14:25:24 2015
+++ src/sbin/gpt/gpt.c Tue Dec 1 18:29:07 2015
@@ -35,7 +35,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/gpt.c,v 1.16 2006/07/07 02:44:23 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: gpt.c,v 1.51 2015/12/01 19:25:24 christos Exp $");
+__RCSID("$NetBSD: gpt.c,v 1.52 2015/12/01 23:29:07 christos Exp $");
#endif
#include <sys/param.h>
@@ -850,7 +850,8 @@ gpt_create(gpt_t gpt, off_t last, u_int
hdr->hdr_lba_alt = htole64(last);
hdr->hdr_lba_start = htole64(gpt->tbl->map_start + blocks);
hdr->hdr_lba_end = htole64(last - blocks - 1LL);
- gpt_uuid_generate(hdr->hdr_guid);
+ if (gpt_uuid_generate(gpt, hdr->hdr_guid) == -1)
+ return -1;
hdr->hdr_lba_table = htole64(gpt->tbl->map_start);
hdr->hdr_entries = htole32((blocks * gpt->secsz) /
sizeof(struct gpt_ent));
@@ -860,7 +861,8 @@ gpt_create(gpt_t gpt, off_t last, u_int
ent = gpt->tbl->map_data;
for (i = 0; i < le32toh(hdr->hdr_entries); i++) {
- gpt_uuid_generate(ent[i].ent_guid);
+ if (gpt_uuid_generate(gpt, ent[i].ent_guid) == -1)
+ return -1;
}
/*
@@ -895,12 +897,50 @@ gpt_create(gpt_t gpt, off_t last, u_int
return last;
}
-int
-gpt_add_find(gpt_t gpt, struct gpt_find *find, int ch)
+static int
+gpt_size_get(gpt_t gpt, off_t *size)
{
+ off_t sectors;
int64_t human_num;
char *p;
+ if (*size > 0)
+ return -1;
+ sectors = strtoll(optarg, &p, 10);
+ if (sectors < 1)
+ return -1;
+ if (*p == '\0' || ((*p == 's' || *p == 'S') && p[1] == '\0')) {
+ *size = sectors * gpt->secsz;
+ return 0;
+ }
+ if ((*p == 'b' || *p == 'B') && p[1] == '\0') {
+ *size = sectors;
+ return 0;
+ }
+ if (dehumanize_number(optarg, &human_num) < 0)
+ return -1;
+ *size = human_num;
+ return 0;
+}
+
+int
+gpt_human_get(off_t *human)
+{
+ int64_t human_num;
+
+ if (*human > 0)
+ return -1;
+ if (dehumanize_number(optarg, &human_num) < 0)
+ return -1;
+ *human = human_num;
+ if (*human < 1)
+ return -1;
+ return 0;
+}
+
+int
+gpt_add_find(gpt_t gpt, struct gpt_find *find, int ch)
+{
switch (ch) {
case 'a':
if (find->all > 0)
@@ -908,31 +948,19 @@ gpt_add_find(gpt_t gpt, struct gpt_find
find->all = 1;
break;
case 'b':
- if (find->block > 0)
- return -1;
- if (dehumanize_number(optarg, &human_num) < 0)
- return -1;
- find->block = human_num;
- if (find->block < 1)
+ if (gpt_human_get(&find->block) == -1)
return -1;
break;
case 'i':
- if (find->entry > 0)
- return -1;
- find->entry = strtoul(optarg, &p, 10);
- if (*p != 0 || find->entry < 1)
+ if (gpt_entry_get(&find->entry) == -1)
return -1;
break;
case 'L':
- if (find->label != NULL)
+ if (gpt_name_get(gpt, &find->label) == -1)
return -1;
- find->label = (uint8_t *)strdup(optarg);
break;
case 's':
- if (find->size > 0)
- return -1;
- find->size = strtoll(optarg, &p, 10);
- if (*p != 0 || find->size < 1)
+ if (gpt_size_get(gpt, &find->size) == -1)
return -1;
break;
case 't':
@@ -1008,44 +1036,18 @@ gpt_change_ent(gpt_t gpt, const struct g
int
gpt_add_ais(gpt_t gpt, off_t *alignment, u_int *entry, off_t *size, int ch)
{
- int64_t human_num;
- off_t sectors;
- char *p;
-
switch (ch) {
case 'a':
- if (*alignment > 0)
- return -1;
- if (dehumanize_number(optarg, &human_num) < 0)
- return -1;
- *alignment = human_num;
- if (*alignment < 1)
+ if (gpt_human_get(alignment) == -1)
return -1;
return 0;
case 'i':
- if (*entry > 0)
- return -1;
- *entry = strtoul(optarg, &p, 10);
- if (*p != 0 || *entry < 1)
+ if (gpt_entry_get(entry) == -1)
return -1;
return 0;
case 's':
- if (*size > 0)
- return -1;
- sectors = strtoll(optarg, &p, 10);
- if (sectors < 1)
- return -1;
- if (*p == '\0' || ((*p == 's' || *p == 'S') && p[1] == '\0')) {
- *size = sectors * gpt->secsz;
- return 0;
- }
- if ((*p == 'b' || *p == 'B') && p[1] == '\0') {
- *size = sectors;
- return 0;
- }
- if (dehumanize_number(optarg, &human_num) < 0)
+ if (gpt_size_get(gpt, size) == -1)
return -1;
- *size = human_num;
return 0;
default:
return -1;
@@ -1142,3 +1144,28 @@ gpt_entry_get(u_int *entry)
return -1;
return 0;
}
+int
+gpt_uuid_get(gpt_t gpt, gpt_uuid_t *uuid)
+{
+ if (!gpt_uuid_is_nil(*uuid))
+ return -1;
+ if (gpt_uuid_parse(optarg, *uuid) != 0) {
+ gpt_warn(gpt, "Can't parse uuid");
+ return -1;
+ }
+ return 0;
+}
+
+int
+gpt_name_get(gpt_t gpt, void *v)
+{
+ char **name = v;
+ if (*name != NULL)
+ return -1;
+ *name = strdup(optarg);
+ if (*name == NULL) {
+ gpt_warn(gpt, "Can't copy string");
+ return -1;
+ }
+ return 0;
+}
Index: src/sbin/gpt/gpt.h
diff -u src/sbin/gpt/gpt.h:1.25 src/sbin/gpt/gpt.h:1.26
--- src/sbin/gpt/gpt.h:1.25 Tue Dec 1 14:25:24 2015
+++ src/sbin/gpt/gpt.h Tue Dec 1 18:29:07 2015
@@ -121,5 +121,8 @@ off_t gpt_check_ais(gpt_t, off_t, u_int,
int gpt_attr_get(uint64_t *);
int gpt_attr_update(gpt_t, u_int, uint64_t, uint64_t);
int gpt_entry_get(u_int *);
+int gpt_human_get(off_t *);
+int gpt_uuid_get(gpt_t, gpt_uuid_t *);
+int gpt_name_get(gpt_t, void *);
#endif /* _GPT_H_ */
Index: src/sbin/gpt/show.c
diff -u src/sbin/gpt/show.c:1.25 src/sbin/gpt/show.c:1.26
--- src/sbin/gpt/show.c:1.25 Tue Dec 1 11:32:19 2015
+++ src/sbin/gpt/show.c Tue Dec 1 18:29:07 2015
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/show.c,v 1.14 2006/06/22 22:22:32 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: show.c,v 1.25 2015/12/01 16:32:19 christos Exp $");
+__RCSID("$NetBSD: show.c,v 1.26 2015/12/01 23:29:07 christos Exp $");
#endif
#include <sys/types.h>
@@ -237,7 +237,6 @@ show_one(gpt_t gpt)
static int
cmd_show(gpt_t gpt, int argc, char *argv[])
{
- char *p;
int ch;
while ((ch = getopt(argc, argv, "gi:lu")) != -1) {
@@ -246,10 +245,7 @@ cmd_show(gpt_t gpt, int argc, char *argv
show_guid = 1;
break;
case 'i':
- if (entry > 0)
- return usage();
- entry = strtoul(optarg, &p, 10);
- if (*p != 0 || entry < 1)
+ if (gpt_entry_get(&entry) == -1)
return usage();
break;
case 'l':
Index: src/sbin/gpt/gpt_uuid.c
diff -u src/sbin/gpt/gpt_uuid.c:1.10 src/sbin/gpt/gpt_uuid.c:1.11
--- src/sbin/gpt/gpt_uuid.c:1.10 Sat Dec 6 07:24:22 2014
+++ src/sbin/gpt/gpt_uuid.c Tue Dec 1 18:29:07 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: gpt_uuid.c,v 1.10 2014/12/06 12:24:22 mlelstv Exp $ */
+/* $NetBSD: gpt_uuid.c,v 1.11 2015/12/01 23:29:07 christos Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifdef __RCSID
-__RCSID("$NetBSD: gpt_uuid.c,v 1.10 2014/12/06 12:24:22 mlelstv Exp $");
+__RCSID("$NetBSD: gpt_uuid.c,v 1.11 2015/12/01 23:29:07 christos Exp $");
#endif
#include <err.h>
@@ -238,8 +238,8 @@ gpt_uuid_create(gpt_type_t t, gpt_uuid_t
utf8_to_utf16((const uint8_t *)gpt_nv[t].d, b, s / sizeof(*b));
}
-void
-gpt_uuid_generate(gpt_uuid_t t)
+int
+gpt_uuid_generate(gpt_t gpt, gpt_uuid_t t)
{
struct dce_uuid u;
int fd;
@@ -249,16 +249,24 @@ gpt_uuid_generate(gpt_uuid_t t)
/* Randomly generate the content. */
fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
- if (fd == -1)
- err(1, "open(/dev/urandom)");
+ if (fd == -1) {
+ gpt_warn(gpt, "Can't open `/dev/urandom'");
+ return -1;
+ }
for (p = (void *)&u, n = sizeof u; 0 < n; p += nread, n -= nread) {
nread = read(fd, p, n);
- if (nread < 0)
- err(1, "read(/dev/urandom)");
- if (nread == 0)
- errx(1, "EOF from /dev/urandom");
- if ((size_t)nread > n)
- errx(1, "read too much: %zd > %zu", nread, n);
+ if (nread < 0) {
+ gpt_warn(gpt, "Can't read `/dev/urandom'");
+ goto out;
+ }
+ if (nread == 0) {
+ gpt_warn(gpt, "EOF from /dev/urandom");
+ goto out;
+ }
+ if ((size_t)nread > n) {
+ gpt_warnx(gpt, "read too much: %zd > %zu", nread, n);
+ goto out;
+ }
}
(void)close(fd);
@@ -271,4 +279,8 @@ gpt_uuid_generate(gpt_uuid_t t)
u.clock_seq_hi_and_reserved |= 0x80;
gpt_dce_to_uuid(&u, t);
+ close(fd);
+ return 0;
+out:
+ return -1;
}
Index: src/sbin/gpt/gpt_uuid.h
diff -u src/sbin/gpt/gpt_uuid.h:1.4 src/sbin/gpt/gpt_uuid.h:1.5
--- src/sbin/gpt/gpt_uuid.h:1.4 Fri Sep 4 13:59:53 2015
+++ src/sbin/gpt/gpt_uuid.h Tue Dec 1 18:29:07 2015
@@ -94,7 +94,8 @@ void gpt_uuid_create(gpt_type_t, gpt_uui
int gpt_uuid_parse(const char *, gpt_uuid_t);
-void gpt_uuid_generate(gpt_uuid_t);
+struct gpt;
+int gpt_uuid_generate(struct gpt *, gpt_uuid_t);
__END_DECLS
Index: src/sbin/gpt/label.c
diff -u src/sbin/gpt/label.c:1.22 src/sbin/gpt/label.c:1.23
--- src/sbin/gpt/label.c:1.22 Tue Dec 1 14:25:24 2015
+++ src/sbin/gpt/label.c Tue Dec 1 18:29:07 2015
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/label.c,v 1.3 2006/10/04 18:20:25 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: label.c,v 1.22 2015/12/01 19:25:24 christos Exp $");
+__RCSID("$NetBSD: label.c,v 1.23 2015/12/01 23:29:07 christos Exp $");
#endif
#include <sys/types.h>
@@ -73,33 +73,46 @@ change(struct gpt_ent *ent, void *v)
utf8_to_utf16(name, ent->ent_name, 36);
}
-static char *
-name_from_file(const char *fn)
+static int
+name_from_file(gpt_t gpt, void *v)
{
FILE *f;
char *p;
size_t maxlen = 1024;
size_t len;
- char *name;
+ const char *fn = optarg;
+ char **name = v;
+
+ if (*name != NULL)
+ return -1;
if (strcmp(fn, "-") != 0) {
f = fopen(fn, "r");
- if (f == NULL)
- err(1, "unable to open file %s", fn);
+ if (f == NULL) {
+ gpt_warn(gpt, "Can't open `%s'", fn);
+ return -1;
+ }
} else
f = stdin;
- name = malloc(maxlen);
- len = fread(name, 1, maxlen - 1, f);
- if (ferror(f))
- err(1, "unable to read label from file %s", fn);
+
+ if ((*name = malloc(maxlen)) == NULL) {
+ gpt_warn(gpt, "Can't copy string");
+ return -1;
+ }
+ len = fread(*name, 1, maxlen - 1, f);
+ if (ferror(f)) {
+ free(*name);
+ gpt_warn(gpt, "Can't label from `%s'", fn);
+ return -1;
+ }
if (f != stdin)
fclose(f);
- name[len] = '\0';
+ (*name)[len] = '\0';
/* Only keep the first line, excluding the newline character. */
- p = strchr((const char *)name, '\n');
+ p = strchr(*name, '\n');
if (p != NULL)
*p = '\0';
- return name;
+ return 0;
}
static int
@@ -116,14 +129,12 @@ cmd_label(gpt_t gpt, int argc, char *arg
while ((ch = getopt(argc, argv, GPT_FIND "f:l:")) != -1) {
switch(ch) {
case 'f':
- if (name != NULL)
+ if (name_from_file(gpt, &name) == -1)
return usage();
- name = name_from_file(optarg);
break;
case 'l':
- if (name != NULL)
+ if (gpt_name_get(gpt, &name) == -1)
return usage();
- name = strdup(optarg);
break;
default:
if (gpt_add_find(gpt, &find, ch) == -1)