diff options
-rw-r--r-- | cpukit/libcsupport/include/rtems/libio_.h | 2 | ||||
-rw-r--r-- | cpukit/libfs/src/defaults/default_readv.c | 24 | ||||
-rw-r--r-- | cpukit/libfs/src/defaults/default_writev.c | 24 | ||||
-rw-r--r-- | testsuites/psxtests/psxrdwrv/test.c | 4 |
4 files changed, 31 insertions, 23 deletions
diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h index 995d621f79..78a57c8620 100644 --- a/cpukit/libcsupport/include/rtems/libio_.h +++ b/cpukit/libcsupport/include/rtems/libio_.h @@ -887,7 +887,7 @@ static inline ssize_t rtems_libio_iovec_eval( total += ( ssize_t ) len; - if ( iov[ v ].iov_base == NULL ) { + if ( iov[ v ].iov_base == NULL && len != 0 ) { rtems_set_errno_and_return_minus_one( EINVAL ); } } diff --git a/cpukit/libfs/src/defaults/default_readv.c b/cpukit/libfs/src/defaults/default_readv.c index 063ed5e678..0156a4138f 100644 --- a/cpukit/libfs/src/defaults/default_readv.c +++ b/cpukit/libfs/src/defaults/default_readv.c @@ -41,19 +41,23 @@ ssize_t rtems_filesystem_default_readv( total = 0; for ( v = 0 ; v < iovcnt ; ++v ) { - ssize_t bytes = ( *iop->pathinfo.handlers->read_h )( - iop, - iov[ v ].iov_base, - iov[ v ].iov_len - ); + size_t len = iov[ v ].iov_len; - if ( bytes < 0 ) - return -1; + if ( len > 0 ) { + ssize_t bytes = ( *iop->pathinfo.handlers->read_h )( + iop, + iov[ v ].iov_base, + len + ); - total += bytes; + if ( bytes < 0 ) + return -1; - if ( bytes != iov[ v ].iov_len ) - break; + total += bytes; + + if ( bytes != ( ssize_t ) len ) + break; + } } return total; diff --git a/cpukit/libfs/src/defaults/default_writev.c b/cpukit/libfs/src/defaults/default_writev.c index e62e084e72..3a4ed82c00 100644 --- a/cpukit/libfs/src/defaults/default_writev.c +++ b/cpukit/libfs/src/defaults/default_writev.c @@ -41,19 +41,23 @@ ssize_t rtems_filesystem_default_writev( total = 0; for ( v = 0 ; v < iovcnt ; ++v ) { - ssize_t bytes = ( *iop->pathinfo.handlers->write_h )( - iop, - iov[ v ].iov_base, - iov[ v ].iov_len - ); + size_t len = iov[ v ].iov_len; - if ( bytes < 0 ) - return -1; + if ( len > 0 ) { + ssize_t bytes = ( *iop->pathinfo.handlers->write_h )( + iop, + iov[ v ].iov_base, + len + ); - total += bytes; + if ( bytes < 0 ) + return -1; - if ( bytes != iov[ v ].iov_len ) - break; + total += bytes; + + if ( bytes != ( ssize_t ) len ) + break; + } } return total; diff --git a/testsuites/psxtests/psxrdwrv/test.c b/testsuites/psxtests/psxrdwrv/test.c index 0e066746a9..181d9d42a1 100644 --- a/testsuites/psxtests/psxrdwrv/test.c +++ b/testsuites/psxtests/psxrdwrv/test.c @@ -361,7 +361,7 @@ int doErrorTest(void) /* writev -- all zero length buffers */ vec[0].iov_base = vec; vec[0].iov_len = 0; - vec[1].iov_base = vec; + vec[1].iov_base = NULL; vec[1].iov_len = 0; puts("writev iov_len works with no effect -- OK"); rc = writev(fd, vec, 2); @@ -374,7 +374,7 @@ int doErrorTest(void) /* readv -- all zero length buffers */ vec[0].iov_base = vec; vec[0].iov_len = 0; - vec[1].iov_base = vec; + vec[1].iov_base = NULL; vec[1].iov_len = 0; puts("readv iov_len works with no effect -- OK"); rc = readv(fd, vec, 2); |