Denys Vlasenko <[email protected]> writes:

> On Sun, Feb 1, 2026 at 3:41 PM Alyssa Ross via busybox
> <[email protected]> wrote:
>> I was working with some very small ext4 filesystems, used for
>> overlaying on immutable VM/container images.  If it's only desired to
>> overlay a single config file, these filesystems can be very small
>> indeed, and so ran afoul of this length check.
>>
>> Since 4fc5ec56f ("device matching against UUIDs: do not try
>> floppies") (from 2009), floppy drives are skipped before this function
>> is even called.  Reading from an unused loop device returns 0, so it
>> should be fine to drop the minimum length, and be happy with any read
>> as long as it returns at least one byte.
>>
>> By initializing read_len to -1, we can handle both lseek() failing and
>> read_full() failing with the same check.
>> ---
>> v2: http://lists.busybox.net/pipermail/busybox/2023-May/090340.html
>>
>> Sending again since I see lots of commits recently.  Still applies.
>>
>>  util-linux/volume_id/util.c | 10 ++--------
>>  1 file changed, 2 insertions(+), 8 deletions(-)
>>
>> diff --git a/util-linux/volume_id/util.c b/util-linux/volume_id/util.c
>> index 061545fde..a5844c673 100644
>> --- a/util-linux/volume_id/util.c
>> +++ b/util-linux/volume_id/util.c
>> @@ -180,7 +180,7 @@ void *volume_id_get_buffer(struct volume_id *id, 
>> uint64_t off, size_t len)
>>  {
>>         uint8_t *dst;
>>         unsigned small_off;
>> -       ssize_t read_len;
>> +       ssize_t read_len = -1;
>>
>>         dbg("get buffer off 0x%llx(%llu), len 0x%zx",
>>                 (unsigned long long) off, (unsigned long long) off, len);
>> @@ -237,13 +237,7 @@ void *volume_id_get_buffer(struct volume_id *id, 
>> uint64_t off, size_t len)
>>                 dbg("requested 0x%x bytes, got 0x%x bytes",
>>                                 (unsigned) len, (unsigned) read_len);
>>   err:
>> -               /* No filesystem can be this tiny. It's most likely
>> -                * non-associated loop device, empty drive and so on.
>> -                * Flag it, making it possible to short circuit future
>> -                * accesses. Rationale:
>> -                * users complained of slow blkid due to empty floppy drives.
>> -                */
>> -               if (off < 64*1024)
>> +               if (read_len <= 0)
>>                         id->error = 1;
>
> This means that any read error, even one far into a block device -
> for example, at ISO_SUPERBLOCK_OFFSET of 0x8000 (32k)
> will flag the device as "errored" and won't probe any other fs's.
>
> We even have these:
> fat.c:  buf = volume_id_get_buffer(id, fat_partition_off +
> root_start_off, buf_size);
>
> I'm changing the check to "if (off <= 1024)" for now.
>
> Let me know if this is insufficient. How small, exactly, was your tiniest FS?

Checking now the smallest I can easily get is 28672.  The ones I
encountered the issue with were probably only slightly bigger than that.
So your change should solve the problem.  Thanks!

Attachment: signature.asc
Description: PGP signature

_______________________________________________
busybox mailing list
[email protected]
https://lists.busybox.net/mailman/listinfo/busybox

Reply via email to