machined: add early checks for unrealistically large image/pool sizes
This commit is contained in:
@@ -43,6 +43,7 @@
|
||||
#include "copy.h"
|
||||
#include "fd-util.h"
|
||||
#include "fileio.h"
|
||||
#include "io-util.h"
|
||||
#include "macro.h"
|
||||
#include "missing.h"
|
||||
#include "path-util.h"
|
||||
@@ -913,6 +914,10 @@ int btrfs_resize_loopback_fd(int fd, uint64_t new_size, bool grow_only) {
|
||||
dev_t dev = 0;
|
||||
int r;
|
||||
|
||||
/* In contrast to btrfs quota ioctls ftruncate() cannot make sense of "infinity" or file sizes > 2^31 */
|
||||
if (!FILE_SIZE_VALID(new_size))
|
||||
return -EINVAL;
|
||||
|
||||
/* btrfs cannot handle file systems < 16M, hence use this as minimum */
|
||||
if (new_size < 16*1024*1024)
|
||||
new_size = 16*1024*1024;
|
||||
|
||||
@@ -77,3 +77,21 @@ static inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) {
|
||||
|
||||
return k;
|
||||
}
|
||||
|
||||
static inline bool FILE_SIZE_VALID(uint64_t l) {
|
||||
/* ftruncate() and friends take an unsigned file size, but actually cannot deal with file sizes larger than
|
||||
* 2^63 since the kernel internally handles it as signed value. This call allows checking for this early. */
|
||||
|
||||
return (l >> 63) == 0;
|
||||
}
|
||||
|
||||
static inline bool FILE_SIZE_VALID_OR_INFINITY(uint64_t l) {
|
||||
|
||||
/* Same as above, but allows one extra value: -1 as indication for infinity. */
|
||||
|
||||
if (l == (uint64_t) -1)
|
||||
return true;
|
||||
|
||||
return FILE_SIZE_VALID(l);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user