udevadm: prevent segfault in blkid builtin when offset not specified

"--offset" takes an optional argument; if none is specified,
stroull() will attempt to parse a NULL pointer. For example:

$ udevadm test-builtin 'blkid --offset' /sys/dev/block/8:1

Update "--offset" to require an argument; also verify that the
offset is not negative.
This commit is contained in:
Douglas Christman 2018-02-27 20:35:58 -05:00
parent 3a6a6889e1
commit 6c1a6df375
1 changed files with 10 additions and 3 deletions

View File

@ -35,6 +35,7 @@
#include "efivars.h"
#include "fd-util.h"
#include "gpt.h"
#include "parse-util.h"
#include "string-util.h"
#include "udev.h"
@ -236,7 +237,7 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t
bool is_gpt = false;
static const struct option options[] = {
{ "offset", optional_argument, NULL, 'o' },
{ "offset", required_argument, NULL, 'o' },
{ "noraid", no_argument, NULL, 'R' },
{}
};
@ -244,13 +245,19 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t
for (;;) {
int option;
option = getopt_long(argc, argv, "oR", options, NULL);
option = getopt_long(argc, argv, "o:R", options, NULL);
if (option == -1)
break;
switch (option) {
case 'o':
offset = strtoull(optarg, NULL, 0);
err = safe_atoi64(optarg, &offset);
if (err < 0)
goto out;
if (offset < 0) {
err = -ERANGE;
goto out;
}
break;
case 'R':
noraid = true;