chiark / gitweb /
analyze: avoid a null dereference
[elogind.git] / src / analyze / analyze.c
index 66e2aabe9639c9508595d329bf7642e1d2f082f0..1281d6b9ea835dfaae5ccf1a6a40bc6a059687f5 100644 (file)
@@ -277,7 +277,8 @@ static int acquire_time_data(sd_bus *bus, struct unit_times **out) {
         return c;
 
 fail:
-        free_unit_times(unit_times, (unsigned) c);
+        if (unit_times)
+                free_unit_times(unit_times, (unsigned) c);
         return r;
 }
 
@@ -1201,8 +1202,8 @@ static void help(void) {
                "     --fuzz=TIMESPAN      When printing the tree of the critical chain, print also\n"
                "                          services, which finished TIMESPAN earlier, than the\n"
                "                          latest in the branch. The unit of TIMESPAN is seconds\n"
-               "                          unless specified with a different unit, i.e. 50ms\n\n"
-               "     --no-man             Do not check for existence of man pages\n"
+               "                          unless specified with a different unit, i.e. 50ms\n"
+               "     --man[=BOOL]         Do [not] check for existence of man pages\n\n"
                "Commands:\n"
                "  time                    Print time spent in the kernel before reaching userspace\n"
                "  blame                   Print list of running units ordered by time to init\n"
@@ -1211,7 +1212,7 @@ static void help(void) {
                "  dot                     Output dependency graph in dot(1) format\n"
                "  set-log-level LEVEL     Set logging threshold for systemd\n"
                "  dump                    Output state serialization of service manager\n"
-               "  verify                  Check unit files for correctness\n"
+               "  verify FILE...          Check unit files for correctness\n"
                , program_invocation_short_name);
 
         /* When updating this list, including descriptions, apply
@@ -1230,7 +1231,7 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_DOT_TO_PATTERN,
                 ARG_FUZZ,
                 ARG_NO_PAGER,
-                ARG_NO_MAN,
+                ARG_MAN,
         };
 
         static const struct option options[] = {
@@ -1244,6 +1245,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "to-pattern",   required_argument, NULL, ARG_DOT_TO_PATTERN   },
                 { "fuzz",         required_argument, NULL, ARG_FUZZ             },
                 { "no-pager",     no_argument,       NULL, ARG_NO_PAGER         },
+                { "man",          optional_argument, NULL, ARG_MAN              },
                 { "host",         required_argument, NULL, 'H'                  },
                 { "machine",      required_argument, NULL, 'M'                  },
                 {}
@@ -1254,10 +1256,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 0);
         assert(argv);
 
-        opterr = 0;
-
-        while ((c = getopt_long(argc, argv, "hH:M:", options, NULL)) >= 0) {
-
+        while ((c = getopt_long(argc, argv, "hH:M:", options, NULL)) >= 0)
                 switch (c) {
 
                 case 'h':
@@ -1317,22 +1316,26 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_host = optarg;
                         break;
 
-                case ARG_NO_MAN:
-                        arg_man = false;
+                case ARG_MAN:
+                        if (optarg) {
+                                r = parse_boolean(optarg);
+                                if (r < 0) {
+                                        log_error("Failed to parse --man= argument.");
+                                        return -EINVAL;
+                                }
+
+                                arg_man = !!r;
+                        } else
+                                arg_man = true;
+
                         break;
 
                 case '?':
-                        log_error("Unknown option %s.", argv[optind-1]);
-                        return -EINVAL;
-
-                case ':':
-                        log_error("Missing argument to %s.", argv[optind-1]);
                         return -EINVAL;
 
                 default:
                         assert_not_reached("Unhandled option code.");
                 }
-        }
 
         return 1; /* work to do */
 }
@@ -1349,12 +1352,12 @@ int main(int argc, char *argv[]) {
         if (r <= 0)
                 goto finish;
 
-        if (streq(argv[optind], "verify"))
+        if (streq_ptr(argv[optind], "verify"))
                 r = verify_units(argv+optind+1,
                                  arg_user ? SYSTEMD_USER : SYSTEMD_SYSTEM,
                                  arg_man);
         else {
-                _cleanup_bus_unref_ sd_bus *bus = NULL;
+                _cleanup_bus_close_unref_ sd_bus *bus = NULL;
 
                 r = bus_open_transport_systemd(arg_transport, arg_host, arg_user, &bus);
                 if (r < 0) {