mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-09 01:40:00 +01:00
Avoid write with zero size.
This can happen if write buffer size is smaller than underlying block size and initial buffer is misaligned. Also use size_t for buffer length variables.
This commit is contained in:
committed by
Milan Broz
parent
34ddae154e
commit
0435fbf2e5
22
lib/utils.c
22
lib/utils.c
@@ -71,7 +71,8 @@ ssize_t write_blockwise(int fd, int bsize, void *orig_buf, size_t count)
|
||||
{
|
||||
void *hangover_buf, *hangover_buf_base = NULL;
|
||||
void *buf, *buf_base = NULL;
|
||||
int r, hangover, solid, alignment;
|
||||
int r, alignment;
|
||||
size_t hangover, solid;
|
||||
ssize_t ret = -1;
|
||||
|
||||
if (fd == -1 || !orig_buf || bsize <= 0)
|
||||
@@ -89,9 +90,11 @@ ssize_t write_blockwise(int fd, int bsize, void *orig_buf, size_t count)
|
||||
} else
|
||||
buf = orig_buf;
|
||||
|
||||
r = write(fd, buf, solid);
|
||||
if (r < 0 || r != solid)
|
||||
goto out;
|
||||
if (solid) {
|
||||
r = write(fd, buf, solid);
|
||||
if (r < 0 || r != (ssize_t)solid)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (hangover) {
|
||||
hangover_buf = aligned_malloc(&hangover_buf_base, bsize, alignment);
|
||||
@@ -99,7 +102,7 @@ ssize_t write_blockwise(int fd, int bsize, void *orig_buf, size_t count)
|
||||
goto out;
|
||||
|
||||
r = read(fd, hangover_buf, bsize);
|
||||
if (r < 0 || r < hangover)
|
||||
if (r < 0 || r < (ssize_t)hangover)
|
||||
goto out;
|
||||
|
||||
if (r < bsize)
|
||||
@@ -111,7 +114,7 @@ ssize_t write_blockwise(int fd, int bsize, void *orig_buf, size_t count)
|
||||
memcpy(hangover_buf, (char*)buf + solid, hangover);
|
||||
|
||||
r = write(fd, hangover_buf, bsize);
|
||||
if (r < 0 || r < hangover)
|
||||
if (r < 0 || r < (ssize_t)hangover)
|
||||
goto out;
|
||||
}
|
||||
ret = count;
|
||||
@@ -125,7 +128,8 @@ out:
|
||||
ssize_t read_blockwise(int fd, int bsize, void *orig_buf, size_t count) {
|
||||
void *hangover_buf, *hangover_buf_base = NULL;
|
||||
void *buf, *buf_base = NULL;
|
||||
int r, hangover, solid, alignment;
|
||||
int r, alignment;
|
||||
size_t hangover, solid;
|
||||
ssize_t ret = -1;
|
||||
|
||||
if (fd == -1 || !orig_buf || bsize <= 0)
|
||||
@@ -143,7 +147,7 @@ ssize_t read_blockwise(int fd, int bsize, void *orig_buf, size_t count) {
|
||||
buf = orig_buf;
|
||||
|
||||
r = read(fd, buf, solid);
|
||||
if(r < 0 || r != solid)
|
||||
if(r < 0 || r != (ssize_t)solid)
|
||||
goto out;
|
||||
|
||||
if (hangover) {
|
||||
@@ -151,7 +155,7 @@ ssize_t read_blockwise(int fd, int bsize, void *orig_buf, size_t count) {
|
||||
if (!hangover_buf)
|
||||
goto out;
|
||||
r = read(fd, hangover_buf, bsize);
|
||||
if (r < 0 || r < hangover)
|
||||
if (r < 0 || r < (ssize_t)hangover)
|
||||
goto out;
|
||||
|
||||
memcpy((char *)buf + solid, hangover_buf, hangover);
|
||||
|
||||
Reference in New Issue
Block a user