Once a pattern file can be much larger, it will be possible that kernel will return a short read while loading the file and thus may randomly only load part of the file. Fix this by putting the read in a loop so the entire file will be read. Signed-off-by: Logan Gunthorpe <logang@xxxxxxxxxxxx> --- lib/pattern.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/pattern.c b/lib/pattern.c index 70d0313d237e..d324263c2b34 100644 --- a/lib/pattern.c +++ b/lib/pattern.c @@ -32,7 +32,7 @@ static const char *parse_file(const char *beg, char *out, const char *end; char *file; int fd; - ssize_t count; + ssize_t rc, count = 0; if (!out_len) goto err_out; @@ -52,9 +52,16 @@ static const char *parse_file(const char *beg, char *out, goto err_free_out; if (out) { - count = read(fd, out, out_len); - if (count == -1) - goto err_free_close_out; + while (1) { + rc = read(fd, out, out_len - count); + if (rc == 0) + break; + if (rc == -1) + goto err_free_close_out; + + count += rc; + out += rc; + } } else { count = lseek(fd, 0, SEEK_END); if (count == -1) -- 2.30.2