The parse_size() wrapper around scan_scaled(3) writes its intermediate result to the function argument which is always passed as literal zero.
This seems odd, the function parameter has no meaning but merely serves as storage, so let's use a proper function scoped variable instead. OK? Index: main.c =================================================================== RCS file: /cvs/src/usr.sbin/vmctl/main.c,v retrieving revision 1.59 diff -u -p -r1.59 main.c --- main.c 27 Oct 2019 08:59:48 -0000 1.59 +++ main.c 6 Dec 2019 17:46:54 -0000 @@ -407,8 +407,10 @@ parse_network(struct parse_result *res, } int -parse_size(struct parse_result *res, char *word, long long val) +parse_size(struct parse_result *res, char *word) { + long long val = 0; + if (word != NULL) { if (scan_scaled(word, &val) != 0) { warn("invalid size: %s", word); @@ -576,7 +578,7 @@ ctl_create(struct parse_result *res, int err(1, "unveil"); break; case 's': - if (parse_size(res, optarg, 0) != 0) + if (parse_size(res, optarg) != 0) errx(1, "invalid size: %s", optarg); break; default: @@ -872,7 +874,7 @@ ctl_start(struct parse_result *res, int case 'm': if (res->size) errx(1, "memory specified multiple times"); - if (parse_size(res, optarg, 0) != 0) + if (parse_size(res, optarg) != 0) errx(1, "invalid memory size: %s", optarg); break; case 'n': Index: vmctl.h =================================================================== RCS file: /cvs/src/usr.sbin/vmctl/vmctl.h,v retrieving revision 1.32 diff -u -p -r1.32 vmctl.h --- vmctl.h 11 May 2019 23:07:46 -0000 1.32 +++ vmctl.h 6 Dec 2019 17:42:51 -0000 @@ -77,7 +77,7 @@ struct imsgbuf *ibuf; int vmmaction(struct parse_result *); int parse_ifs(struct parse_result *, char *, int); int parse_network(struct parse_result *, char *); -int parse_size(struct parse_result *, char *, long long); +int parse_size(struct parse_result *, char *); int parse_disktype(const char *, const char **); int parse_disk(struct parse_result *, char *, int); int parse_vmid(struct parse_result *, char *, int);