X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=init.c;h=21779c7b162fda0dadeb9f2238d7a334f7c7f3db;hb=b7e147d1552c022838f4b9d8f02c477b6f906084;hp=215b60d40418c9e379cfc50b3e93493ebf3656e6;hpb=bcdcb5ab2db296ea3f92ab15b811ff1fe8cab446;p=fio.git diff --git a/init.c b/init.c index 215b60d4..21779c7b 100644 --- a/init.c +++ b/init.c @@ -942,6 +942,7 @@ static char *make_filename(char *buf, struct thread_options *o, { struct fpre_keyword *f; char copy[PATH_MAX]; + size_t dst_left = PATH_MAX - 1; if (!o->filename_format || !strlen(o->filename_format)) { sprintf(buf, "%s.%d.%d", jobname, jobnum, filenum); @@ -969,25 +970,47 @@ static char *make_filename(char *buf, struct thread_options *o, if (pre_len) { strncpy(dst, buf, pre_len); dst += pre_len; + dst_left -= pre_len; } switch (f->key) { - case FPRE_JOBNAME: - dst += sprintf(dst, "%s", jobname); + case FPRE_JOBNAME: { + int ret; + + ret = snprintf(dst, dst_left, "%s", jobname); + if (ret < 0) + break; + dst += ret; + dst_left -= ret; break; - case FPRE_JOBNUM: - dst += sprintf(dst, "%d", jobnum); + } + case FPRE_JOBNUM: { + int ret; + + ret = snprintf(dst, dst_left, "%d", jobnum); + if (ret < 0) + break; + dst += ret; + dst_left -= ret; break; - case FPRE_FILENUM: - dst += sprintf(dst, "%d", filenum); + } + case FPRE_FILENUM: { + int ret; + + ret = snprintf(dst, dst_left, "%d", filenum); + if (ret < 0) + break; + dst += ret; + dst_left -= ret; break; + } default: assert(0); break; } if (post_start) - strcpy(dst, buf + post_start); + strncpy(dst, buf + post_start, dst_left); strcpy(buf, copy); } while (1); @@ -1435,9 +1458,6 @@ int parse_jobs_ini(char *file, int is_buf, int stonewall_flag, int type) i++; } - for (i = 0; i < num_opts; i++) - free(opts[i]); - free(string); free(name); free(opts); @@ -1842,7 +1862,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type) if (!strncmp(opt, "name", 4) && td) { ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type); if (ret) - return 0; + goto out_free; td = NULL; } if (!td) { @@ -1857,7 +1877,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type) td = get_new_job(global, &def_thread, 1); if (!td || ioengine_load(td)) - return 0; + goto out_free; fio_options_set_ioengine_opts(l_opts, td); } @@ -1879,7 +1899,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type) if (!ret && !strcmp(opt, "ioengine")) { free_ioengine(td); if (ioengine_load(td)) - return 0; + goto out_free; fio_options_set_ioengine_opts(l_opts, td); } break; @@ -2005,6 +2025,10 @@ int parse_cmd_line(int argc, char *argv[], int client_type) optind++; } +out_free: + if (pid_file) + free(pid_file); + return ini_idx; }