From f5b646791f2d4e60ffd467c130d4f0eabaf0d2e1 Mon Sep 17 00:00:00 2001 From: adilger Date: Mon, 2 Sep 2002 21:56:21 +0000 Subject: [PATCH] Remove ancient Perl cruft from obd.c. Do stricter checking on all strtoul() input to avoid strange problems when we have, say, 'w' for the object ID or whatever. --- lustre/utils/obd.c | 243 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 160 insertions(+), 83 deletions(-) diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 074c044..a639844 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -95,32 +95,6 @@ do { \ } \ } while (0) -/* - pack "LL LL LL LL LL LL LL L L L L L L L L L a60 a60 L L L", - $obdo->{id}, 0, - $obdo->{gr}, 0, - $obdo->{atime}, 0, - $obdo->{mtime}, 0 , - $obdo->{ctime}, 0, - $obdo->{size}, 0, - $obdo->{blocks}, 0, - $obdo->{blksize}, - $obdo->{mode}, - $obdo->{uid}, - $obdo->{gid}, - $obdo->{flags}, - $obdo->{obdflags}, - $obdo->{nlink}, - $obdo->{generation}, - $obdo->{valid}, - $obdo->{inline}, - $obdo->{obdmd}, - 0, 0, # struct list_head - 0; # struct obd_ops -} - -*/ - char *obdo_print(struct obdo *obd) { char buf[1024]; @@ -144,6 +118,7 @@ char *obdo_print(struct obdo *obd) } +#define BAD_VERBOSE (-999999999) #define N2D_OFF 0x100 /* So we can tell between error codes and devices */ @@ -181,7 +156,7 @@ static int do_name2dev(char *func, char *name) * supports a number or name. * FIXME: support UUID */ -static int parse_devname(char * func, char *name) +static int parse_devname(char *func, char *name) { int rc; int ret = -1; @@ -192,8 +167,7 @@ static int parse_devname(char * func, char *name) rc = do_name2dev(func, name + 1); if (rc >= N2D_OFF) { ret = rc - N2D_OFF; - printf("%s is device %d\n", name, - ret); + printf("%s is device %d\n", name, ret); } else { fprintf(stderr, "error: %s: %s: %s\n", cmdname(func), name, "device not found"); @@ -256,7 +230,7 @@ static int be_verbose(int verbose, struct timeval *next_time, } /* A negative verbosity means to print at most each X seconds */ - if (verbose < 0 && next_time != NULL && difftime(&now, next_time) >= 0) { + if (verbose < 0 && next_time != NULL && difftime(&now, next_time) >= 0){ next_time->tv_sec = now.tv_sec - verbose; next_time->tv_usec = now.tv_usec; if (next_num) @@ -267,16 +241,23 @@ static int be_verbose(int verbose, struct timeval *next_time, return 0; } -static int get_verbose(const char *arg) +static int get_verbose(char *func, const char *arg) { int verbose; + char *end; if (!arg || arg[0] == 'v') verbose = 1; else if (arg[0] == 's' || arg[0] == 'q') verbose = 0; - else - verbose = (int)strtoul(arg, NULL, 0); + else { + verbose = (int)strtoul(arg, &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad verbose option '%s'\n", + cmdname(func), arg); + return BAD_VERBOSE; + } + } if (verbose < 0) printf("Print status every %d seconds\n", -verbose); @@ -447,7 +428,7 @@ int jt_obd_connect(int argc, char **argv) do_disconnect(argv[0], 1); -#warning Robert: implement timeout per lctl usage for probe +#warning TODO: implement timeout per lctl usage for probe if (argc != 1) return CMD_HELP; @@ -479,11 +460,8 @@ int jt_opt_device(int argc, char **argv) int ret; int rc; - if (argc < 3) { - fprintf(stderr, "usage: %s devno \n", - cmdname(argv[0])); - return -1; - } + if (argc < 3) + return CMD_HELP; rc = do_device("device", parse_devname(argv[0], argv[1])); @@ -508,18 +486,22 @@ int jt_opt_threads(int argc, char **argv) int threads, next_thread; int verbose; int rc = 0; + char *end; int i; - if (argc < 5) { - fprintf(stderr, - "usage: %s numthreads verbose devno \n", - argv[0]); - return -1; - } + if (argc < 5) + return CMD_HELP; - threads = strtoul(argv[1], NULL, 0); + threads = strtoul(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid page count '%s'\n", + cmdname(argv[0]), argv[1]); + return CMD_HELP; + } - verbose = get_verbose(argv[2]); + verbose = get_verbose(argv[0], argv[2]); + if (verbose == BAD_VERBOSE) + return CMD_HELP; if (verbose != 0) printf("%s: starting %d threads on device %s running %s\n", @@ -573,7 +555,7 @@ int jt_opt_threads(int argc, char **argv) * always returns 1 (OK). See wait(2). */ int err = WEXITSTATUS(status); - if (err) + if (err || WIFSIGNALED(status)) fprintf(stderr, "%s: PID %d had rc=%d\n", argv[0], ret, err); @@ -790,21 +772,35 @@ int jt_obd_create(int argc, char **argv) int count = 1, next_count; int verbose = 1; int rc = 0, i; + char *end; IOCINIT(data); if (argc < 2 || argc > 4) return CMD_HELP; - count = strtoul(argv[1], NULL, 0); + count = strtoul(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid iteration count '%s'\n", + cmdname(argv[0]), argv[1]); + return CMD_HELP; + } - if (argc > 2) - data.ioc_obdo1.o_mode = strtoul(argv[2], NULL, 0); - else + if (argc > 2) { + data.ioc_obdo1.o_mode = strtoul(argv[2], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid mode '%s'\n", + cmdname(argv[0]), argv[2]); + return CMD_HELP; + } + } else data.ioc_obdo1.o_mode = 0100644; data.ioc_obdo1.o_valid = OBD_MD_FLMODE; - if (argc > 3) - verbose = get_verbose(argv[3]); + if (argc > 3) { + verbose = get_verbose(argv[0], argv[3]); + if (verbose == BAD_VERBOSE) + return CMD_HELP; + } printf("%s: %d objects\n", cmdname(argv[0]), count); gettimeofday(&next_time, NULL); @@ -828,14 +824,25 @@ int jt_obd_create(int argc, char **argv) int jt_obd_setattr(int argc, char **argv) { struct obd_ioctl_data data; + char *end; int rc; IOCINIT(data); if (argc != 2) return CMD_HELP; - data.ioc_obdo1.o_id = strtoul(argv[1], NULL, 0); - data.ioc_obdo1.o_mode = S_IFREG | strtoul(argv[2], NULL, 0); + data.ioc_obdo1.o_id = strtoul(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid objid '%s'\n", + cmdname(argv[0]), argv[1]); + return CMD_HELP; + } + data.ioc_obdo1.o_mode = S_IFREG | strtoul(argv[2], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid mode '%s'\n", + cmdname(argv[0]), argv[2]); + return CMD_HELP; + } data.ioc_obdo1.o_valid = OBD_MD_FLMODE; rc = ioctl(fd, OBD_IOC_SETATTR, &data); @@ -849,13 +856,19 @@ int jt_obd_setattr(int argc, char **argv) int jt_obd_destroy(int argc, char **argv) { struct obd_ioctl_data data; + char *end; int rc; IOCINIT(data); if (argc != 2) return CMD_HELP; - data.ioc_obdo1.o_id = strtoul(argv[1], NULL, 0); + data.ioc_obdo1.o_id = strtoul(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid objid '%s'\n", + cmdname(argv[0]), argv[1]); + return CMD_HELP; + } data.ioc_obdo1.o_mode = S_IFREG | 0644; rc = ioctl(fd, OBD_IOC_DESTROY, &data); @@ -869,13 +882,19 @@ int jt_obd_destroy(int argc, char **argv) int jt_obd_getattr(int argc, char **argv) { struct obd_ioctl_data data; + char *end; int rc; if (argc != 2) return CMD_HELP; IOCINIT(data); - data.ioc_obdo1.o_id = strtoul(argv[1], NULL, 0); + data.ioc_obdo1.o_id = strtoul(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid objid '%s'\n", + cmdname(argv[0]), argv[1]); + return CMD_HELP; + } /* to help obd filter */ data.ioc_obdo1.o_mode = 0100644; data.ioc_obdo1.o_valid = 0xffffffff; @@ -898,17 +917,25 @@ int jt_obd_test_getattr(int argc, char **argv) struct timeval start, next_time; int i, count, next_count; int verbose; + char *end; int rc = 0; if (argc != 2 && argc != 3) return CMD_HELP; IOCINIT(data); - count = strtoul(argv[1], NULL, 0); + count = strtoul(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: invalid iteration count '%s'\n", + cmdname(argv[0]), argv[1]); + return CMD_HELP; + } - if (argc == 3) - verbose = get_verbose(argv[2]); - else + if (argc == 3) { + verbose = get_verbose(argv[0], argv[2]); + if (verbose == BAD_VERBOSE) + return CMD_HELP; + } else verbose = 1; data.ioc_obdo1.o_valid = 0xffffffff; @@ -959,14 +986,23 @@ int jt_obd_test_brw(int argc, char **argv) int pages = 1, objid = 3, count, next_count; int verbose = 1, write = 0, rw; long long offset; + char *end; int i; int len; int rc = 0; - if (argc < 2 || argc > 6) + if (argc < 2 || argc > 6) { + fprintf(stderr, "error: %s: bad number of arguments: %d\n", + cmdname(argv[0]), argc); return CMD_HELP; + } - count = strtoul(argv[1], NULL, 0); + count = strtoul(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad iteration count '%s'\n", + cmdname(argv[0]), argv[1]); + return CMD_HELP; + } if (argc >= 3) { if (argv[2][0] == 'w' || argv[2][0] == '1') @@ -974,13 +1010,27 @@ int jt_obd_test_brw(int argc, char **argv) else if (argv[2][0] == 'r' || argv[2][0] == '0') write = 0; - verbose = get_verbose(argv[3]); + verbose = get_verbose(argv[0], argv[3]); + if (verbose == BAD_VERBOSE) + return CMD_HELP; } - if (argc >= 5) - pages = strtoul(argv[4], NULL, 0); - if (argc >= 6) - objid = strtoul(argv[5], NULL, 0); + if (argc >= 5) { + pages = strtoul(argv[4], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad page count '%s'\n", + cmdname(argv[0]), argv[4]); + return CMD_HELP; + } + } + if (argc >= 6) { + objid = strtoul(argv[5], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad objid '%s'\n", + cmdname(argv[0]), argv[5]); + return CMD_HELP; + } + } len = pages * PAGE_SIZE; @@ -1039,38 +1089,65 @@ int jt_obd_lov_config(int argc, char **argv) struct lov_desc desc; uuid_t *uuidarray; int rc, size, i; + char *end; + IOCINIT(data); if (argc <= 6) return CMD_HELP; - if (strlen(argv[1]) > sizeof(uuid_t) - 1) { - fprintf(stderr, "lov_config: no %dB memory for uuid's\n", - strlen(argv[1])); + if (strlen(argv[1]) > sizeof(*uuidarray) - 1) { + fprintf(stderr, "error: %s: no %dB memory for uuid's\n", + cmdname(argv[0]), strlen(argv[1])); return -ENOMEM; } memset(&desc, 0, sizeof(desc)); - strcpy(desc.ld_uuid, argv[1]); - desc.ld_default_stripe_count = strtoul(argv[2], NULL, 0); - desc.ld_default_stripe_size = strtoul(argv[3], NULL, 0); - desc.ld_default_stripe_offset = (__u64) strtoul(argv[4], NULL, 0); - desc.ld_pattern = strtoul(argv[5], NULL, 0); + strncpy(desc.ld_uuid, argv[1], sizeof(*uuidarray) - 1); + desc.ld_default_stripe_count = strtoul(argv[2], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad default stripe count '%s'\n", + cmdname(argv[0]), argv[2]); + return CMD_HELP; + } + desc.ld_default_stripe_size = strtoul(argv[3], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad default stripe size '%s'\n", + cmdname(argv[0]), argv[3]); + return CMD_HELP; + } + if (desc.ld_default_stripe_size < 4096) { + fprintf(stderr, "error: %s: stripe size %ld too small\n", + cmdname(argv[0]), (long)desc.ld_default_stripe_size); + return -EINVAL; + } + desc.ld_default_stripe_offset = (__u64) strtoul(argv[4], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad default stripe offset '%s'\n", + cmdname(argv[0]), argv[4]); + return CMD_HELP; + } + desc.ld_pattern = strtoul(argv[5], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: bad stripe pattern '%s'\n", + cmdname(argv[0]), argv[5]); + return CMD_HELP; + } desc.ld_tgt_count = argc - 6; - - size = sizeof(uuid_t) * desc.ld_tgt_count; + size = desc.ld_tgt_count * sizeof(*uuidarray); uuidarray = malloc(size); if (!uuidarray) { - fprintf(stderr, "lov_config: no %dB memory for uuid's\n", size); + fprintf(stderr, "error: %s: no %dB memory for uuid's\n", + cmdname(argv[0]), size); return -ENOMEM; } memset(uuidarray, 0, size); for (i = 6; i < argc; i++) { char *buf = (char *)(uuidarray + i - 6); - if (strlen(argv[i]) >= sizeof(uuid_t)) { - fprintf(stderr, "lov_config: arg %d (%s) too long\n", - i, argv[i]); + if (strlen(argv[i]) >= sizeof(*uuidarray)) { + fprintf(stderr, "error: %s: arg %d (%s) too long\n", + cmdname(argv[0]), i, argv[i]); free(uuidarray); return -EINVAL; } -- 1.8.3.1