]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
Merge branch 'maint' into next
authorTheodore Ts'o <tytso@mit.edu>
Tue, 16 Apr 2024 16:50:46 +0000 (12:50 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 16 Apr 2024 16:50:46 +0000 (12:50 -0400)
.github/workflows/ci.yml
lib/ext2fs/getsize.c
lib/ext2fs/openfs.c
lib/ext2fs/windows_io.c
tests/f_desc_size_zero/expect.1 [new file with mode: 0644]
tests/f_desc_size_zero/image.gz [new file with mode: 0644]
tests/f_desc_size_zero/name [new file with mode: 0644]
tests/f_desc_size_zero/script [new file with mode: 0644]

index 0c14250a42678c04c18f12e6100e6116aff22afe..da44fd07815ce30a1b989d19c97e6ab704f574b4 100644 (file)
@@ -120,7 +120,6 @@ jobs:
     - run: make -j8 -C lib/support/ all V=1 CFLAGS_WARN="-Werror"
     - run: make -j8 -C lib/e2p/ all V=1 CFLAGS_WARN="-Werror"
     - run: make -j8 -C misc/ mke2fs V=1 CFLAGS_WARN="-Werror"
-    - run: touch image.ext4
     - run: misc/mke2fs.exe -T ext4 image.ext4 128M
     - uses: actions/upload-artifact@v3
       with:
index bcf30208ea791c51c295a1d0a8b6f56c1bc3d59f..a028634439a099845ac7dee7921497cd6ce944fc 100644 (file)
 #define HAVE_GET_FILE_SIZE_EX 1
 #endif
 
-HANDLE windows_get_handle(io_channel channel);
-
 errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
                                  blk64_t *retblocks)
 {
-       HANDLE dev;
+       int fd;
+       HANDLE h;
        PARTITION_INFORMATION pi;
        DISK_GEOMETRY gi;
        DWORD retbytes;
@@ -86,25 +85,18 @@ errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
        DWORD filesize;
 #endif /* HAVE_GET_FILE_SIZE_EX */
 
-       io_channel data_io = 0;
-       int retval;
-
-       retval = windows_io_manager->open(file, 0, &data_io);
-       if (retval)
-               return retval;
-
-       dev = windows_get_handle(data_io);
-       if (dev == INVALID_HANDLE_VALUE)
-               return EBADF;
-
-       if (DeviceIoControl(dev, IOCTL_DISK_GET_PARTITION_INFO,
+       fd = ext2fs_open_file(file, O_RDONLY, 0);
+       if (fd < 0)
+               return errno;
+       h = (HANDLE)_get_osfhandle(fd);
+       if (DeviceIoControl(h, IOCTL_DISK_GET_PARTITION_INFO,
                            &pi, sizeof(PARTITION_INFORMATION),
                            &pi, sizeof(PARTITION_INFORMATION),
                            &retbytes, NULL)) {
 
                *retblocks = pi.PartitionLength.QuadPart / blocksize;
 
-       } else if (DeviceIoControl(dev, IOCTL_DISK_GET_DRIVE_GEOMETRY,
+       } else if (DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_GEOMETRY,
                                &gi, sizeof(DISK_GEOMETRY),
                                &gi, sizeof(DISK_GEOMETRY),
                                &retbytes, NULL)) {
@@ -115,20 +107,19 @@ errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
                             gi.Cylinders.QuadPart / blocksize;
 
 #ifdef HAVE_GET_FILE_SIZE_EX
-       } else if (GetFileSizeEx(dev, &filesize)) {
+       } else if (GetFileSizeEx(h, &filesize)) {
                *retblocks = filesize.QuadPart / blocksize;
        }
 #else
        } else {
-               filesize = GetFileSize(dev, NULL);
+               filesize = GetFileSize(h, NULL);
                if (INVALID_FILE_SIZE != filesize) {
                        *retblocks = filesize / blocksize;
                }
        }
 #endif /* HAVE_GET_FILE_SIZE_EX */
 
-       windows_io_manager->close(data_io);
-
+       close(fd);
        return 0;
 }
 
index c3611e0d8ad4bb7db54b6a926c28b656ab074b23..eb44d58642ca5074ab57ba627cbbf823d755d1a6 100644 (file)
@@ -333,9 +333,10 @@ retry:
        if (ext2fs_has_feature_64bit(fs->super)) {
                unsigned desc_size = fs->super->s_desc_size;
 
-               if (desc_size < EXT2_MIN_DESC_SIZE_64BIT ||
+               if (desc_size == 0 ||
                    (!(flags & EXT2_FLAG_IGNORE_SB_ERRORS) &&
                     ((desc_size > EXT2_MAX_DESC_SIZE) ||
+                     (desc_size < EXT2_MIN_DESC_SIZE_64BIT) ||
                      (desc_size & (desc_size - 1)) != 0))) {
                        retval = EXT2_ET_BAD_DESC_SIZE;
                        goto cleanup;
index 83aea68b653c6b337cd03c7717965255ef82b51b..f01bbb6ad1a65c337b0eb0bf440cfd1c5c71e7a5 100644 (file)
@@ -857,17 +857,6 @@ static errcode_t windows_write_byte(io_channel channel, unsigned long offset,
        return EXT2_ET_UNIMPLEMENTED;
 }
 
-HANDLE windows_get_handle(io_channel channel)
-{
-       struct windows_private_data *data;
-
-       EXT2_CHECK_MAGIC_RETURN(channel, EXT2_ET_MAGIC_IO_CHANNEL, INVALID_HANDLE_VALUE);
-       data = (struct windows_private_data *) channel->private_data;
-       EXT2_CHECK_MAGIC_RETURN(data, EXT2_ET_MAGIC_WINDOWS_IO_CHANNEL, INVALID_HANDLE_VALUE);
-
-       return data->handle;
-}
-
 /*
  * Flush data buffers to disk.
  */
diff --git a/tests/f_desc_size_zero/expect.1 b/tests/f_desc_size_zero/expect.1
new file mode 100644 (file)
index 0000000..acb752a
--- /dev/null
@@ -0,0 +1,13 @@
+../e2fsck/e2fsck: Block group descriptor size incorrect while trying to open test.img
+../e2fsck/e2fsck: Trying to load superblock despite errors...
+../e2fsck/e2fsck: Block group descriptor size incorrect while trying to open test.img
+
+The superblock could not be read or does not describe a valid ext2/ext3/ext4
+filesystem.  If the device is valid and it really contains an ext2/ext3/ext4
+filesystem (and not swap or ufs or something else), then the superblock
+is corrupt, and you might try running e2fsck with an alternate superblock:
+    e2fsck -b 8193 <device>
+ or
+    e2fsck -b 32768 <device>
+
+Exit status is 8
diff --git a/tests/f_desc_size_zero/image.gz b/tests/f_desc_size_zero/image.gz
new file mode 100644 (file)
index 0000000..4e43c0c
Binary files /dev/null and b/tests/f_desc_size_zero/image.gz differ
diff --git a/tests/f_desc_size_zero/name b/tests/f_desc_size_zero/name
new file mode 100644 (file)
index 0000000..e77bb11
--- /dev/null
@@ -0,0 +1 @@
+zero s_desc_size
diff --git a/tests/f_desc_size_zero/script b/tests/f_desc_size_zero/script
new file mode 100644 (file)
index 0000000..8ab2b9c
--- /dev/null
@@ -0,0 +1,2 @@
+ONE_PASS_ONLY="true"
+. $cmd_dir/run_e2fsck