mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-11 19:00:02 +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
18
lib/utils.c
18
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 *hangover_buf, *hangover_buf_base = NULL;
|
||||||
void *buf, *buf_base = NULL;
|
void *buf, *buf_base = NULL;
|
||||||
int r, hangover, solid, alignment;
|
int r, alignment;
|
||||||
|
size_t hangover, solid;
|
||||||
ssize_t ret = -1;
|
ssize_t ret = -1;
|
||||||
|
|
||||||
if (fd == -1 || !orig_buf || bsize <= 0)
|
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
|
} else
|
||||||
buf = orig_buf;
|
buf = orig_buf;
|
||||||
|
|
||||||
|
if (solid) {
|
||||||
r = write(fd, buf, solid);
|
r = write(fd, buf, solid);
|
||||||
if (r < 0 || r != solid)
|
if (r < 0 || r != (ssize_t)solid)
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (hangover) {
|
if (hangover) {
|
||||||
hangover_buf = aligned_malloc(&hangover_buf_base, bsize, alignment);
|
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;
|
goto out;
|
||||||
|
|
||||||
r = read(fd, hangover_buf, bsize);
|
r = read(fd, hangover_buf, bsize);
|
||||||
if (r < 0 || r < hangover)
|
if (r < 0 || r < (ssize_t)hangover)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (r < bsize)
|
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);
|
memcpy(hangover_buf, (char*)buf + solid, hangover);
|
||||||
|
|
||||||
r = write(fd, hangover_buf, bsize);
|
r = write(fd, hangover_buf, bsize);
|
||||||
if (r < 0 || r < hangover)
|
if (r < 0 || r < (ssize_t)hangover)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = count;
|
ret = count;
|
||||||
@@ -125,7 +128,8 @@ out:
|
|||||||
ssize_t read_blockwise(int fd, int bsize, void *orig_buf, size_t count) {
|
ssize_t read_blockwise(int fd, int bsize, void *orig_buf, size_t count) {
|
||||||
void *hangover_buf, *hangover_buf_base = NULL;
|
void *hangover_buf, *hangover_buf_base = NULL;
|
||||||
void *buf, *buf_base = NULL;
|
void *buf, *buf_base = NULL;
|
||||||
int r, hangover, solid, alignment;
|
int r, alignment;
|
||||||
|
size_t hangover, solid;
|
||||||
ssize_t ret = -1;
|
ssize_t ret = -1;
|
||||||
|
|
||||||
if (fd == -1 || !orig_buf || bsize <= 0)
|
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;
|
buf = orig_buf;
|
||||||
|
|
||||||
r = read(fd, buf, solid);
|
r = read(fd, buf, solid);
|
||||||
if(r < 0 || r != solid)
|
if(r < 0 || r != (ssize_t)solid)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (hangover) {
|
if (hangover) {
|
||||||
@@ -151,7 +155,7 @@ ssize_t read_blockwise(int fd, int bsize, void *orig_buf, size_t count) {
|
|||||||
if (!hangover_buf)
|
if (!hangover_buf)
|
||||||
goto out;
|
goto out;
|
||||||
r = read(fd, hangover_buf, bsize);
|
r = read(fd, hangover_buf, bsize);
|
||||||
if (r < 0 || r < hangover)
|
if (r < 0 || r < (ssize_t)hangover)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
memcpy((char *)buf + solid, hangover_buf, hangover);
|
memcpy((char *)buf + solid, hangover_buf, hangover);
|
||||||
|
|||||||
Reference in New Issue
Block a user