[OpenWrt-Devel] libblkid-tiny: bugged buffer management
Rafał Miłecki
zajec5 at gmail.com
Mon Aug 26 11:33:34 EDT 2019
I noticed a bug in "block" tool behavior. It was providing inconsistent
UUIDs for my disks with NTFS partitions.
Please check UUID of /dev/sda1 in following examples:
root at OpenWrt:/# block info
/dev/mtdblock4: UUID="8463a403-99b3cf92-d2b7996f-c4ede4f4" VERSION="4.0" MOUNT="/rom" TYPE="squashfs"
/dev/mtdblock5: MOUNT="/overlay" TYPE="jffs2"
/dev/sda1: UUID="6AA9873636CA5409" TYPE="ntfs"
/dev/sda2: UUID="0000001800000030" TYPE="ntfs"
/dev/sdb1: UUID="0000001800000030" TYPE="ntfs"
root at OpenWrt:/# block detect
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
config 'mount'
option target '/mnt/sda1'
option uuid '0000001800000030'
option enabled '0'
config 'mount'
option target '/mnt/sda2'
option uuid '0000001800000030'
option enabled '0'
config 'mount'
option target '/mnt/sdb1'
option uuid '0000001800000030'
option enabled '0'
That bug was exposed by cache_load(0) vs. cache_load(1). Those calls
result in different order of buffer allocation in the
blkid_probe_get_buffer().
This problem is caused by:
1) blkid_probe_get_buffer() resuing buffer when possible
2) __probe_ntfs() reading multiple blocks
As you can probably guess any subsequent block ready can overwrite a
content of previously returned block content buffer. In __probe_ntfs()
case it's something like:
ns = blkid_probe_get_sb(...);
buf_mft = blkid_probe_get_buffer(...);
buf_mft = blkid_probe_get_buffer(...);
ns->volume_serial
If you take a look at blkid_probe_get_buffer() in the original project
(util-linux's libblkid) it's a bit more complicated:
https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/tree/libblkid/src/probe.c#n640
Any idea/hint how to resolve it in some simple way?
--
Rafał
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list