actual = pread64(data->dev, buf, size, location);
if (actual == size)
return 0;
+ actual = 0;
}
#elif HAVE_PREAD
/* Try an aligned pread */
actual = pread(data->dev, buf, size, location);
if (actual == size)
return 0;
+ actual = 0;
}
#endif /* HAVE_PREAD */
return 0;
error_out:
- memset((char *) buf+actual, 0, size-actual);
+ if (actual >= 0 && actual < size)
+ memset((char *) buf+actual, 0, size-actual);
if (channel->read_error)
retval = (channel->read_error)(channel, block, count, buf,
size, actual, retval);
int fd_flags;
fd = atoi(str_fd);
+#if defined(HAVE_FCNTL)
fd_flags = fcntl(fd, F_GETFD);
if (fd_flags == -1)
return -EBADF;
if (fd_flags & O_DIRECT)
flags |= IO_FLAG_DIRECT_IO;
#endif
+#endif /* HAVE_FCNTL */
return unix_open_channel(str_fd, fd, flags, channel, unixfd_io_manager);
}
#ifndef NO_IO_CACHE
retval = flush_cached_blocks(channel, data, 0);
#endif
+#ifdef HAVE_FSYNC
if (!retval && fsync(data->dev) != 0)
return errno;
+#endif
return retval;
}