Fix crash on loading unknown IO engine with --ioengine
[fio.git] / init.c
diff --git a/init.c b/init.c
index 8448586847c8db10a74143610a1c233d92b72278..74a02e07422f37477f8b3a883c0f02ffa6a22bd1 100644 (file)
--- a/init.c
+++ b/init.c
@@ -1739,7 +1739,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        write_bw_log = 1;
                        break;
                case 'o':
-                       if (f_out)
+                       if (f_out && f_out != stdout)
                                fclose(f_out);
 
                        f_out = fopen(optarg, "w+");
@@ -1884,8 +1884,14 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                        continue;
 
                                td = get_new_job(global, &def_thread, 1);
-                               if (!td || ioengine_load(td))
-                                       goto out_free;
+                               if (!td || ioengine_load(td)) {
+                                       if (td) {
+                                               put_job(td);
+                                               td = NULL;
+                                       }
+                                       do_exit++;
+                                       break;
+                               }
                                fio_options_set_ioengine_opts(l_opts, td);
                        }
 
@@ -1906,8 +1912,14 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
 
                        if (!ret && !strcmp(opt, "ioengine")) {
                                free_ioengine(td);
-                               if (ioengine_load(td))
-                                       goto out_free;
+                               if (ioengine_load(td)) {
+                                       if (td) {
+                                               put_job(td);
+                                               td = NULL;
+                                       }
+                                       do_exit++;
+                                       break;
+                               }
                                fio_options_set_ioengine_opts(l_opts, td);
                        }
                        break;
@@ -1920,7 +1932,6 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                break;
 
                        ret = fio_cmd_ioengine_option_parse(td, opt, val);
-                       did_arg = 1;
                        break;
                }
                case 'w':