summaryrefslogtreecommitdiff
path: root/libblkid-tiny/libblkid-tiny.c
diff options
context:
space:
mode:
authorRafał Miłecki <rafal@milecki.pl>2019-12-14 22:55:01 +0100
committerRafał Miłecki <rafal@milecki.pl>2019-12-20 07:43:15 +0100
commit0c5761f076e1db5f10d6207fe9b5ec381b1b8ff2 (patch)
treea92645a48315a131ebea1a1c4a843d35bcb9f1f8 /libblkid-tiny/libblkid-tiny.c
parentb82c5c109c8545da1c4fea46e102aef25896c0e4 (diff)
downloadfstools-0c5761f076e1db5f10d6207fe9b5ec381b1b8ff2.tar.gz
libblkid-tiny: use separated buffer for each block device read
This allows reading multiple chunks of block device data and operating on them simultaneously. Previous implementation was using a single buffer (except for reading more data than allocated size) and subsequent reads were corrupting memory of previously returned buffers. This fixes e.g. problem with reading NTFS UUID and validating VFAT signature. Implementation is based on original libblkid code which handles it similarly. Buffers are put on probe internal list and freed when releasing a probe struct. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Diffstat (limited to 'libblkid-tiny/libblkid-tiny.c')
-rw-r--r--libblkid-tiny/libblkid-tiny.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/libblkid-tiny/libblkid-tiny.c b/libblkid-tiny/libblkid-tiny.c
index a30f619..05b4b99 100644
--- a/libblkid-tiny/libblkid-tiny.c
+++ b/libblkid-tiny/libblkid-tiny.c
@@ -13,9 +13,6 @@
int blkid_debug_mask = 0;
-static unsigned char *probe_buffer;
-static unsigned int probe_buffer_size = 0;
-
int get_linux_version (void)
{
static int kver = -1;
@@ -81,32 +78,27 @@ int blkid_probe_sprintf_version(blkid_probe pr, const char *fmt, ...)
unsigned char *blkid_probe_get_buffer(blkid_probe pr,
blkid_loff_t off, blkid_loff_t len)
{
+ struct blkid_bufinfo *bf;
int ret;
- unsigned char *buf;
-
- if (len > probe_buffer_size) {
- buf = realloc(probe_buffer, len);
- if (!buf) {
- fprintf(stderr, "failed to allocate %d byte buffer\n",
- (int)len);
-
- return NULL;
- }
-
- probe_buffer = buf;
- probe_buffer_size = len;
- }
-
- memset(probe_buffer, 0, probe_buffer_size);
+ bf = malloc(sizeof(*bf) + len);
+ if (!bf)
+ return NULL;
+ memset(bf, 0, sizeof(*bf));
+ bf->data = ((unsigned char *)bf) + sizeof(*bf);
lseek(pr->fd, off, SEEK_SET);
- ret = read(pr->fd, probe_buffer, len);
+ ret = read(pr->fd, bf->data, len);
- if (ret != len)
+ if (ret != len) {
fprintf(stderr, "faile to read blkid\n");
+ free(bf);
+ return NULL;
+ }
+
+ list_add_tail(&bf->bufs, &pr->buffers);
- return probe_buffer;
+ return bf->data;
}
int blkid_probe_set_label(blkid_probe pr, unsigned char *label, size_t len)