Recent changes (master)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The following changes since commit fb73340c52bcab712dfb175dafbcb5156abdda12:

  Windows: set sizeof(sun_path) to 260 (MAX_PATH). (2014-04-14 20:19:54 -0600)

are available in the git repository at:

  git://git.kernel.dk/fio.git master

for you to fetch changes up to 3a35845f7756a8a86b420650bff41267192dce22:

  sg/binject: only restore file flags if they have been set (2014-04-15 09:07:44 -0600)

----------------------------------------------------------------
Jens Axboe (7):
      strcpy: kill last of the suspect ones
      Merge branch 'master' of ssh://git.kernel.dk/data/git/fio
      idletime: fix another missing unlock on error
      backend: fix potential division-by-zero
      binject: check for error in fcntl() restore of flags
      sg: check for error in fcntl() restore of flags
      sg/binject: only restore file flags if they have been set

 backend.c         |    6 +++++-
 cconv.c           |   11 +++++++----
 engines/binject.c |   11 +++++++++--
 engines/sg.c      |   13 ++++++++++---
 filesetup.c       |    4 ++--
 fio.h             |    2 +-
 idletime.c        |    4 +++-
 init.c            |   10 ++++++----
 libfio.c          |   11 +++++++----
 stat.c            |    6 ++++--
 10 files changed, 54 insertions(+), 24 deletions(-)

---

Diff of recent changes:

diff --git a/backend.c b/backend.c
index 62bca29..12e562b 100644
--- a/backend.c
+++ b/backend.c
@@ -204,7 +204,11 @@ static int __check_min_rate(struct thread_data *td, struct timeval *now,
 						td->o.name, rate_iops);
 				return 1;
 			} else {
-				rate = ((iops - td->rate_blocks[ddir]) * 1000) / spent;
+				if (spent)
+					rate = ((iops - td->rate_blocks[ddir]) * 1000) / spent;
+				else
+					rate = 0;
+
 				if (rate < rate_iops_min ||
 				    iops < td->rate_blocks[ddir]) {
 					log_err("%s: min iops rate %u not met,"
diff --git a/cconv.c b/cconv.c
index 5b9c3be..ee3b0ca 100644
--- a/cconv.c
+++ b/cconv.c
@@ -10,14 +10,17 @@ static void string_to_cpu(char **dst, const uint8_t *src)
 		*dst = strdup(__src);
 }
 
-static void string_to_net(uint8_t *dst, const char *src)
+static void __string_to_net(uint8_t *dst, const char *src, size_t dst_size)
 {
-	if (src)
-		strcpy((char *) dst, src);
-	else
+	if (src) {
+		dst[dst_size - 1] = '\0';
+		strncpy((char *) dst, src, dst_size - 1);
+	} else
 		dst[0] = '\0';
 }
 
+#define string_to_net(dst, src)	__string_to_net((dst), (src), sizeof(dst))
+
 static void free_thread_options_to_cpu(struct thread_options *o)
 {
 	free(o->description);
diff --git a/engines/binject.c b/engines/binject.c
index 0264d0a..43e3169 100644
--- a/engines/binject.c
+++ b/engines/binject.c
@@ -110,7 +110,9 @@ static int fio_binject_getevents(struct thread_data *td, unsigned int min,
 		 * don't block for min events == 0
 		 */
 		if (!min)
-			fio_set_fd_nonblocking(bf->fd, "binject");
+			bd->fd_flags[i] = fio_set_fd_nonblocking(bf->fd, "binject");
+		else
+			bd->fd_flags[i] = -1;
 
 		bd->pfds[i].fd = bf->fd;
 		bd->pfds[i].events = POLLIN;
@@ -153,7 +155,12 @@ static int fio_binject_getevents(struct thread_data *td, unsigned int min,
 	if (!min) {
 		for_each_file(td, f, i) {
 			bf = (struct binject_file *) (uintptr_t) f->engine_data;
-			fcntl(bf->fd, F_SETFL, bd->fd_flags[i]);
+
+			if (bd->fd_flags[i] == -1)
+				continue;
+
+			if (fcntl(bf->fd, F_SETFL, bd->fd_flags[i]) < 0)
+				log_err("fio: binject failed to restore fcntl flags: %s\n", strerror(errno));
 		}
 	}
 
diff --git a/engines/sg.c b/engines/sg.c
index fcd9c41..1a027da 100644
--- a/engines/sg.c
+++ b/engines/sg.c
@@ -78,7 +78,9 @@ static int fio_sgio_getevents(struct thread_data *td, unsigned int min,
 		 * don't block for min events == 0
 		 */
 		if (!min)
-			fio_set_fd_nonblocking(f->fd, "sg");
+			sd->fd_flags[i] = fio_set_fd_nonblocking(f->fd, "sg");
+		else
+			sd->fd_flags[i] = -1;
 
 		sd->pfds[i].fd = f->fd;
 		sd->pfds[i].events = POLLIN;
@@ -142,8 +144,13 @@ re_read:
 	}
 
 	if (!min) {
-		for_each_file(td, f, i)
-			fcntl(f->fd, F_SETFL, sd->fd_flags[i]);
+		for_each_file(td, f, i) {
+			if (sd->fd_flags[i] == -1)
+				continue;
+
+			if (fcntl(f->fd, F_SETFL, sd->fd_flags[i]) < 0)
+				log_err("fio: sg failed to restore fcntl flags: %s\n", strerror(errno));
+		}
 	}
 
 	return r;
diff --git a/filesetup.c b/filesetup.c
index 490f0fc..60e7947 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -711,8 +711,8 @@ static unsigned long long get_fs_free_counts(struct thread_data *td)
 		if (fm)
 			continue;
 
-		fm = malloc(sizeof(*fm));
-		strcpy(fm->__base, buf);
+		fm = calloc(1, sizeof(*fm));
+		strncpy(fm->__base, buf, sizeof(fm->__base) - 1);
 		fm->base = basename(fm->__base);
 		fm->key = sb.st_dev;
 		flist_add(&fm->list, &list);
diff --git a/fio.h b/fio.h
index 544916f..9eecba3 100644
--- a/fio.h
+++ b/fio.h
@@ -441,7 +441,7 @@ extern char *num2str(unsigned long, int, int, int, int);
 extern int ioengine_load(struct thread_data *);
 extern int parse_dryrun(void);
 extern int fio_running_or_pending_io_threads(void);
-extern void fio_set_fd_nonblocking(int, const char *);
+extern int fio_set_fd_nonblocking(int, const char *);
 
 extern uintptr_t page_mask;
 extern uintptr_t page_size;
diff --git a/idletime.c b/idletime.c
index 8d23154..a366d2b 100644
--- a/idletime.c
+++ b/idletime.c
@@ -73,8 +73,10 @@ static void *idle_prof_thread_fn(void *data)
 	pthread_mutex_lock(&ipt->init_lock);
 
 	/* exit if any other thread failed to start */
-	if (ipc.status == IDLE_PROF_STATUS_ABORT)
+	if (ipc.status == IDLE_PROF_STATUS_ABORT) {
+		pthread_mutex_unlock(&ipt->init_lock);
 		return NULL;
+	}
 
 	retval = set_cpu_affinity(ipt);
 	if (retval == -1) {
diff --git a/init.c b/init.c
index 7630978..8448586 100644
--- a/init.c
+++ b/init.c
@@ -937,7 +937,7 @@ static struct fpre_keyword {
 	{ .keyword = NULL, },
 	};
 
-static char *make_filename(char *buf, struct thread_options *o,
+static char *make_filename(char *buf, size_t buf_size,struct thread_options *o,
 			   const char *jobname, int jobnum, int filenum)
 {
 	struct fpre_keyword *f;
@@ -952,7 +952,9 @@ static char *make_filename(char *buf, struct thread_options *o,
 	for (f = &fpre_keywords[0]; f->keyword; f++)
 		f->strlen = strlen(f->keyword);
 
-	strcpy(buf, o->filename_format);
+	buf[buf_size - 1] = '\0';
+	strncpy(buf, o->filename_format, buf_size - 1);
+
 	memset(copy, 0, sizeof(copy));
 	for (f = &fpre_keywords[0]; f->keyword; f++) {
 		do {
@@ -1012,7 +1014,7 @@ static char *make_filename(char *buf, struct thread_options *o,
 			if (post_start)
 				strncpy(dst, buf + post_start, dst_left);
 
-			strcpy(buf, copy);
+			strncpy(buf, copy, buf_size - 1);
 		} while (1);
 	}
 
@@ -1072,7 +1074,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
 			add_file(td, jobname, job_add_num, 0);
 		else {
 			for (i = 0; i < o->nr_files; i++)
-				add_file(td, make_filename(fname, o, jobname, job_add_num, i), job_add_num, 0);
+				add_file(td, make_filename(fname, sizeof(fname), o, jobname, job_add_num, i), job_add_num, 0);
 		}
 	}
 
diff --git a/libfio.c b/libfio.c
index 5ed8c60..8af1129 100644
--- a/libfio.c
+++ b/libfio.c
@@ -234,7 +234,7 @@ int fio_running_or_pending_io_threads(void)
 	return 0;
 }
 
-void fio_set_fd_nonblocking(int fd, const char *who)
+int fio_set_fd_nonblocking(int fd, const char *who)
 {
 	int flags;
 
@@ -242,11 +242,14 @@ void fio_set_fd_nonblocking(int fd, const char *who)
 	if (flags < 0)
 		log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno));
 	else {
-		flags |= O_NONBLOCK;
-		flags = fcntl(fd, F_SETFL, flags);
-		if (flags < 0)
+		int new_flags = flags | O_NONBLOCK;
+
+		new_flags = fcntl(fd, F_SETFL, new_flags);
+		if (new_flags < 0)
 			log_err("fio: %s failed to get file flags: %s\n", who, strerror(errno));
 	}
+
+	return flags;
 }
 
 static int endian_check(void)
diff --git a/stat.c b/stat.c
index fbf0118..3adb46e 100644
--- a/stat.c
+++ b/stat.c
@@ -1272,10 +1272,12 @@ static void __show_run_stats(void)
 			if (!td->error && td->o.continue_on_error &&
 			    td->first_error) {
 				ts->error = td->first_error;
-				strcpy(ts->verror, td->verror);
+				ts->verror[sizeof(ts->verror) - 1] = '\0';
+				strncpy(ts->verror, td->verror, sizeof(ts->verror) - 1);
 			} else  if (td->error) {
 				ts->error = td->error;
-				strcpy(ts->verror, td->verror);
+				ts->verror[sizeof(ts->verror) - 1] = '\0';
+				strncpy(ts->verror, td->verror, sizeof(ts->verror) - 1);
 			}
 		}
 
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux