Fix access-outside-array of o->rwmix[]
authorJens Axboe <axboe@kernel.dk>
Fri, 8 Nov 2013 17:57:08 +0000 (10:57 -0700)
committerJens Axboe <axboe@kernel.dk>
Fri, 8 Nov 2013 17:57:08 +0000 (10:57 -0700)
gcc 4.9 rightfully complains about it, though in a very obtuse way:

     CC cconv.o
In file included from thread_options.h:5:0,
                  from cconv.c:3:
cconv.c: In function 'convert_thread_options_to_cpu':
os/os.h:197:16: warning: iteration 2u invokes undefined behavior
[-Waggressive-loop-optimizations]
   __le32_to_cpu(*__val);   \
                 ^
os/os.h:176:28: note: in definition of macro '__le32_to_cpu'
  #define __le32_to_cpu(x)  (x)
                             ^
cconv.c:78:17: note: in expansion of macro 'le32_to_cpu'
    o->rwmix[i] = le32_to_cpu(top->rwmix[i]);
                  ^
cconv.c:63:2: note: containing loop
   for (i = 0; i < DDIR_RWDIR_CNT; i++) {
   ^
In file included from thread_options.h:5:0,
                  from cconv.c:3:
cconv.c: In function 'convert_thread_options_to_net':
os/os.h:209:16: warning: iteration 2u invokes undefined behavior
[-Waggressive-loop-optimizations]
   __cpu_to_le32(*__val);   \
                 ^
os/os.h:179:28: note: in definition of macro '__cpu_to_le32'
  #define __cpu_to_le32(x)  (x)
                             ^
cconv.c:372:19: note: in expansion of macro 'cpu_to_le32'
    top->rwmix[i] = cpu_to_le32(o->rwmix[i]);
                    ^
cconv.c:352:2: note: containing loop
   for (i = 0; i < DDIR_RWDIR_CNT; i++) {
   ^
In file included from thread_options.h:5:0,
                  from cconv.c:3:
cconv.c: In function 'fio_test_cconv':
os/os.h:209:16: warning: iteration 2u invokes undefined behavior
[-Waggressive-loop-optimizations]
   __cpu_to_le32(*__val);   \
                 ^
os/os.h:179:28: note: in definition of macro '__cpu_to_le32'
  #define __cpu_to_le32(x)  (x)
                             ^
cconv.c:372:19: note: in expansion of macro 'cpu_to_le32'
    top->rwmix[i] = cpu_to_le32(o->rwmix[i]);
                    ^
cconv.c:352:2: note: containing loop
   for (i = 0; i < DDIR_RWDIR_CNT; i++) {
   ^
In file included from thread_options.h:5:0,
                  from cconv.c:3:
os/os.h:197:16: warning: iteration 2u invokes undefined behavior
[-Waggressive-loop-optimizations]
   __le32_to_cpu(*__val);   \
                 ^
os/os.h:176:28: note: in definition of macro '__le32_to_cpu'
  #define __le32_to_cpu(x)  (x)
                             ^
cconv.c:78:17: note: in expansion of macro 'le32_to_cpu'
    o->rwmix[i] = le32_to_cpu(top->rwmix[i]);
                  ^
cconv.c:63:2: note: containing loop
   for (i = 0; i < DDIR_RWDIR_CNT; i++) {
   ^

Fix it by extending the rwmix indexes to the full rwdir count,
even though it doesn't support trim as part of the mix (yet).

Reported-by: Bruce Cran <bruce@cran.org.uk>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
server.h
thread_options.h

index aefd4183248313a190973759b353f2bc433cb782..5d9b6ccadae36c8114918466f9e8b52f794c79bd 100644 (file)
--- a/server.h
+++ b/server.h
@@ -38,7 +38,7 @@ struct fio_net_cmd_reply {
 };
 
 enum {
 };
 
 enum {
-       FIO_SERVER_VER                  = 25,
+       FIO_SERVER_VER                  = 26,
 
        FIO_SERVER_MAX_FRAGMENT_PDU     = 1024,
 
 
        FIO_SERVER_MAX_FRAGMENT_PDU     = 1024,
 
index 3f345c56b3bafaca9eb5acd1210e58633fb63f86..484b16a56e7568dc42fd55847be967e469ae1070 100644 (file)
@@ -157,7 +157,7 @@ struct thread_options {
 #endif
        unsigned int iolog;
        unsigned int rwmixcycle;
 #endif
        unsigned int iolog;
        unsigned int rwmixcycle;
-       unsigned int rwmix[2];
+       unsigned int rwmix[DDIR_RWDIR_CNT];
        unsigned int nice;
        unsigned int ioprio;
        unsigned int ioprio_class;
        unsigned int nice;
        unsigned int ioprio;
        unsigned int ioprio_class;
@@ -362,7 +362,7 @@ struct thread_options_pack {
        uint32_t verify_cpumask_set;
        uint32_t iolog;
        uint32_t rwmixcycle;
        uint32_t verify_cpumask_set;
        uint32_t iolog;
        uint32_t rwmixcycle;
-       uint32_t rwmix[2];
+       uint32_t rwmix[DDIR_RWDIR_CNT];
        uint32_t nice;
        uint32_t ioprio;
        uint32_t ioprio_class;
        uint32_t nice;
        uint32_t ioprio;
        uint32_t ioprio_class;