From: Arshad Hussain Date: Wed, 17 Jan 2024 09:34:25 +0000 (+0530) Subject: LU-17000 utils: Add check after calling sysconf(_SC_PAGESIZE) X-Git-Tag: 2.15.61~61 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=b02a9bc1bf1af07cf7784f7f19ce10dc55b7bedb;p=fs%2Flustre-release.git LU-17000 utils: Add check after calling sysconf(_SC_PAGESIZE) Calling sysconf(_SC_PAGESIZE) could return -1 on error. This patch adds check after calling sysconf() instead of directly using the value Test-Parameters: trivial testlist=sanity-flr CoverityID: 397578 ("Argument cannot be negative") CoverityID: 397246 ("Argument cannot be negative") CoverityID: 397320 ("Argument cannot be negative") CoverityID: 397671 ("Argument cannot be negative") CoverityID: 397826 ("Argument cannot be negative") CoverityID: 397898 ("Argument cannot be negative") CoverityID: 397917 ("Argument cannot be negative") CoverityID: 399702 ("Argument cannot be negative") Fixes: 0561c144 (LU-13397 lfs: mirror extend/copy keeps sparseness) Fixes: a5905b2a (LU-11245 flr: lfs mirror dump command) Fixes: f1daa8fc (LU-10287 flr: lfs mirror verify command) Fixes: 0e5c12ac (LU-10916 lfs: improve lfs mirror resync) Fixes: 5d7c4fa6 (LU-9771 flr: mirror read and write) Fixes: 5999c0b8 (LU-9771 flr: resync support and test tool) Fixes: 9b44cf70 (LU-13224 utils: expose llapi_param* functions) Signed-off-by: Arshad Hussain Change-Id: I19d13528f63d4586a17aaa9d15313872f8c40c94 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/53693 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Timothy Day Reviewed-by: Oleg Drokin --- diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 0630646..5a78328 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -807,7 +807,7 @@ static int migrate_copy_data(int fd_src, int fd_dst, int (*check_file)(int), void *buf = NULL; off_t pos = 0; off_t data_end = 0; - size_t page_size = sysconf(_SC_PAGESIZE); + size_t page_size; bool sparse; int rc; size_t write_bytes = 0; @@ -836,6 +836,12 @@ static int migrate_copy_data(int fd_src, int fd_dst, int (*check_file)(int), buf_size = (bandwidth_bytes_sec + stripe_size - 1) & ~(stripe_size - 1); + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + rc = -errno; + return rc; + } + /* Use a page-aligned buffer for direct I/O */ rc = posix_memalign(&buf, page_size, buf_size); if (rc != 0) @@ -11715,6 +11721,7 @@ static inline int lfs_mirror_read(int argc, char **argv) int c; void *buf; const size_t buflen = 4 << 20; + size_t page_size; off_t pos; struct option long_opts[] = { { .val = 'h', .name = "help", .has_arg = no_argument }, @@ -11800,8 +11807,14 @@ static inline int lfs_mirror_read(int argc, char **argv) outfd = STDOUT_FILENO; } + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + rc = -errno; + goto close_fd; + } + /* allocate buffer */ - rc = posix_memalign(&buf, sysconf(_SC_PAGESIZE), buflen); + rc = posix_memalign(&buf, page_size, buflen); if (rc) { fprintf(stderr, "%s %s: posix_memalign returns %d\n", progname, argv[0], rc); @@ -12610,7 +12623,7 @@ int lfs_mirror_verify_chunk(int fd, size_t file_size, { const size_t buflen = 4 * 1024 * 1024; /* 4M */ void *buf; - size_t page_size = sysconf(_SC_PAGESIZE); + size_t page_size; ssize_t bytes_read; ssize_t bytes_done; size_t count; @@ -12623,6 +12636,12 @@ int lfs_mirror_verify_chunk(int fd, size_t file_size, if (file_size == 0) return 0; + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + rc = -errno; + return rc; + } + rc = posix_memalign(&buf, page_size, buflen); if (rc) /* error code is returned directly */ return -rc; diff --git a/lustre/utils/liblustreapi_layout.c b/lustre/utils/liblustreapi_layout.c index 3cabaf3..84c6379 100644 --- a/lustre/utils/liblustreapi_layout.c +++ b/lustre/utils/liblustreapi_layout.c @@ -3008,8 +3008,8 @@ int llapi_mirror_resync_many_params(int fd, struct llapi_layout *layout, unsigned long stats_interval_sec, unsigned long bandwidth_bytes_sec) { - size_t page_size = sysconf(_SC_PAGESIZE); size_t buflen = 64 << 20; /* 64M */ + size_t page_size; void *buf; uint64_t pos = start; uint64_t data_off = pos, data_end = pos; @@ -3037,6 +3037,13 @@ int llapi_mirror_resync_many_params(int fd, struct llapi_layout *layout, /* limit transfer size to what can be sent in one second */ if (bandwidth_bytes_sec && bandwidth_bytes_sec < buflen) buflen = (bandwidth_bytes_sec + ONE_MB - 1) & ~(ONE_MB - 1); + + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + rc = -errno; + return rc; + } + rc = posix_memalign(&buf, page_size, buflen); if (rc) return -rc; diff --git a/lustre/utils/liblustreapi_mirror.c b/lustre/utils/liblustreapi_mirror.c index b93c948..3988c33 100644 --- a/lustre/utils/liblustreapi_mirror.c +++ b/lustre/utils/liblustreapi_mirror.c @@ -113,10 +113,16 @@ int llapi_mirror_clear(int fd) ssize_t llapi_mirror_read(int fd, unsigned int id, void *buf, size_t count, off_t pos) { - size_t page_size = sysconf(_SC_PAGESIZE); ssize_t result = 0; + size_t page_size; int rc; + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + rc = -errno; + return rc; + } + rc = llapi_mirror_set(fd, id); if (rc < 0) return rc; @@ -150,10 +156,14 @@ ssize_t llapi_mirror_read(int fd, unsigned int id, void *buf, size_t count, ssize_t llapi_mirror_write(int fd, unsigned int id, const void *buf, size_t count, off_t pos) { - size_t page_size = sysconf(_SC_PAGESIZE); ssize_t result = 0; + size_t page_size; int rc; + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) + return -EINVAL; + if (((unsigned long)buf & (page_size - 1)) || pos & (page_size - 1)) return -EINVAL; @@ -278,7 +288,7 @@ ssize_t llapi_mirror_copy_many(int fd, __u16 src, __u16 *dst, size_t count) void *buf; off_t pos = 0; off_t data_end = 0; - size_t page_size = sysconf(_SC_PAGESIZE); + size_t page_size; ssize_t result = 0; bool eof = false; bool sparse; @@ -289,6 +299,12 @@ ssize_t llapi_mirror_copy_many(int fd, __u16 src, __u16 *dst, size_t count) if (!count) return 0; + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + rc = -errno; + return rc; + } + rc = posix_memalign(&buf, page_size, buflen); if (rc) /* error code is returned directly */ return -rc; @@ -417,14 +433,18 @@ int llapi_mirror_copy(int fd, unsigned int src, unsigned int dst, off_t pos, size_t count) { const size_t buflen = 4 * 1024 * 1024; /* 4M */ - void *buf; - size_t page_size = sysconf(_SC_PAGESIZE); ssize_t result = 0; + size_t page_size; + void *buf; int rc; if (!count) return 0; + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) + return -EINVAL; + if (pos & (page_size - 1) || !dst) return -EINVAL; diff --git a/lustre/utils/liblustreapi_param.c b/lustre/utils/liblustreapi_param.c index 2932e90..49b0773 100644 --- a/lustre/utils/liblustreapi_param.c +++ b/lustre/utils/liblustreapi_param.c @@ -202,10 +202,14 @@ int llapi_param_get_paths(const char *pattern, glob_t *paths) */ static int bytes_remaining(int fd, size_t *file_size) { - int rc = 0; size_t bytes_read = 0; - long page_size = sysconf(_SC_PAGESIZE); + long page_size; char *temp_buf; + int rc = 0; + + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) + return -EINVAL; temp_buf = malloc(page_size); if (temp_buf == NULL) @@ -252,12 +256,17 @@ static int required_size(const char *path, size_t *file_size) static int copy_file_expandable(const char *path, char **buf, size_t *file_size) { - long page_size = sysconf(_SC_PAGESIZE); - int rc = 0; + long page_size; char *temp_buf; - int fd; + int rc = 0, fd; FILE *fp; + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + rc = -errno; + goto out; + } + fp = open_memstream(buf, file_size); if (fp == NULL) { rc = -errno;