summaryrefslogtreecommitdiffstats
path: root/sys/fs/udf/udf_vnops.c
diff options
context:
space:
mode:
authorremko <remko@FreeBSD.org>2007-06-11 20:14:44 +0000
committerremko <remko@FreeBSD.org>2007-06-11 20:14:44 +0000
commit5983912c3d4a6d4930df2b9c1d6a416afa44ffc2 (patch)
treea2eff5bab1f57c9d5e09891669c10b1d961990a9 /sys/fs/udf/udf_vnops.c
parent1294243b0904bb1392f338c03b0cc4fd9a775519 (diff)
downloadFreeBSD-src-5983912c3d4a6d4930df2b9c1d6a416afa44ffc2.zip
FreeBSD-src-5983912c3d4a6d4930df2b9c1d6a416afa44ffc2.tar.gz
Correct corrupt read when the read starts at a non-aligned offset.
PR: kern/77234 MFC After: 1 week Approved by: imp (mentor) Requested by: many many people Submitted by: Andriy Gapon <avg at icyb dot net dot ua>
Diffstat (limited to 'sys/fs/udf/udf_vnops.c')
-rw-r--r--sys/fs/udf/udf_vnops.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/fs/udf/udf_vnops.c b/sys/fs/udf/udf_vnops.c
index 8505473..b77e571 100644
--- a/sys/fs/udf/udf_vnops.c
+++ b/sys/fs/udf/udf_vnops.c
@@ -1080,20 +1080,22 @@ udf_readatoffset(struct udf_node *node, int *size, off_t offset,
*size = max_size;
*size = min(*size, MAXBSIZE);
- if ((error = udf_readlblks(udfmp, sector, *size, bp))) {
+ if ((error = udf_readlblks(udfmp, sector, *size + (offset & udfmp->bmask), bp))) {
printf("warning: udf_readlblks returned error %d\n", error);
/* note: *bp may be non-NULL */
return (error);
}
bp1 = *bp;
- *data = (uint8_t *)&bp1->b_data[offset % udfmp->bsize];
+ *data = (uint8_t *)&bp1->b_data[offset & udfmp->bmask];
return (0);
}
/*
* Translate a file offset into a logical block and then into a physical
* block.
+ * max_size - maximum number of bytes that can be read starting from given
+ * offset, rather than beginning of calculated sector number
*/
static int
udf_bmap_internal(struct udf_node *node, off_t offset, daddr_t *sector,
@@ -1148,7 +1150,7 @@ udf_bmap_internal(struct udf_node *node, off_t offset, daddr_t *sector,
lsector = (offset >> udfmp->bshift) +
le32toh(((struct short_ad *)(icb))->pos);
- *max_size = GETICBLEN(short_ad, icb);
+ *max_size = icblen - offset;
break;
case 1:
@@ -1173,7 +1175,7 @@ udf_bmap_internal(struct udf_node *node, off_t offset, daddr_t *sector,
lsector = (offset >> udfmp->bshift) +
le32toh(((struct long_ad *)(icb))->loc.lb_num);
- *max_size = GETICBLEN(long_ad, icb);
+ *max_size = icblen - offset;
break;
case 3:
OpenPOWER on IntegriCloud