Fix errors on compressed NTFS with 512B clusters.
* include/grub/ntfs.h (grub_ntfscomp_func_t): Use appropriately sized types. * grub-core/fs/ntfs.c (grub_ntfs_read): Return correct -1 on error and not 0. * grub-core/fs/ntfscomp.c (read_block): Use appropriately-sized types. Relax check for inline extents. (ntfscomp): Return correct -1 on error and not 0.
This commit is contained in:
parent
4f8e368fc0
commit
1b8463f2c4
4 changed files with 23 additions and 10 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2012-05-04 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Fix errors on compressed NTFS with 512B clusters.
|
||||||
|
|
||||||
|
* include/grub/ntfs.h (grub_ntfscomp_func_t): Use appropriately sized
|
||||||
|
types.
|
||||||
|
* grub-core/fs/ntfs.c (grub_ntfs_read): Return correct -1 on error and
|
||||||
|
not 0.
|
||||||
|
* grub-core/fs/ntfscomp.c (read_block): Use appropriately-sized types.
|
||||||
|
Relax check for inline extents.
|
||||||
|
(ntfscomp): Return correct -1 on error and not 0.
|
||||||
|
|
||||||
2012-05-04 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-05-04 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* util/grub-install.in: Fix handling of prefix containing spaces.
|
* util/grub-install.in: Fix handling of prefix containing spaces.
|
||||||
|
|
|
@ -1121,7 +1121,7 @@ grub_ntfs_read (grub_file_t file, char *buf, grub_size_t len)
|
||||||
mft->attr.save_pos = 1;
|
mft->attr.save_pos = 1;
|
||||||
|
|
||||||
read_attr (&mft->attr, buf, file->offset, len, 1, file->read_hook);
|
read_attr (&mft->attr, buf, file->offset, len, 1, file->read_hook);
|
||||||
return (grub_errno) ? 0 : len;
|
return (grub_errno) ? -1 : (grub_ssize_t) len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
|
|
|
@ -176,18 +176,19 @@ decomp_block (struct grub_ntfs_comp *cc, char *dest)
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
read_block (struct grub_ntfs_rlst *ctx, char *buf, int num)
|
read_block (struct grub_ntfs_rlst *ctx, char *buf, grub_size_t num)
|
||||||
{
|
{
|
||||||
int cpb = GRUB_NTFS_COM_SEC / ctx->comp.spc;
|
int cpb = GRUB_NTFS_COM_SEC / ctx->comp.spc;
|
||||||
|
|
||||||
while (num)
|
while (num)
|
||||||
{
|
{
|
||||||
int nn;
|
grub_size_t nn;
|
||||||
|
|
||||||
if ((ctx->target_vcn & 0xF) == 0)
|
if ((ctx->target_vcn & 0xF) == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (ctx->comp.comp_head != ctx->comp.comp_tail)
|
if (ctx->comp.comp_head != ctx->comp.comp_tail
|
||||||
|
&& !(ctx->flags & GRUB_NTFS_RF_BLNK))
|
||||||
return grub_error (GRUB_ERR_BAD_FS, "invalid compression block");
|
return grub_error (GRUB_ERR_BAD_FS, "invalid compression block");
|
||||||
ctx->comp.comp_head = ctx->comp.comp_tail = 0;
|
ctx->comp.comp_head = ctx->comp.comp_tail = 0;
|
||||||
ctx->comp.cbuf_vcn = ctx->target_vcn;
|
ctx->comp.cbuf_vcn = ctx->target_vcn;
|
||||||
|
@ -243,7 +244,7 @@ read_block (struct grub_ntfs_rlst *ctx, char *buf, int num)
|
||||||
nn *= cpb;
|
nn *= cpb;
|
||||||
while ((ctx->comp.comp_head < ctx->comp.comp_tail) && (nn))
|
while ((ctx->comp.comp_head < ctx->comp.comp_tail) && (nn))
|
||||||
{
|
{
|
||||||
int tt;
|
grub_disk_addr_t tt;
|
||||||
|
|
||||||
tt =
|
tt =
|
||||||
ctx->comp.comp_table[ctx->comp.comp_head][0] -
|
ctx->comp.comp_table[ctx->comp.comp_head][0] -
|
||||||
|
@ -287,8 +288,8 @@ read_block (struct grub_ntfs_rlst *ctx, char *buf, int num)
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
ntfscomp (struct grub_ntfs_attr *at, char *dest, grub_uint32_t ofs,
|
ntfscomp (struct grub_ntfs_attr *at, char *dest, grub_disk_addr_t ofs,
|
||||||
grub_uint32_t len, struct grub_ntfs_rlst *ctx, grub_uint32_t vcn)
|
grub_size_t len, struct grub_ntfs_rlst *ctx, grub_disk_addr_t vcn)
|
||||||
{
|
{
|
||||||
grub_err_t ret;
|
grub_err_t ret;
|
||||||
|
|
||||||
|
|
|
@ -181,10 +181,10 @@ struct grub_ntfs_rlst
|
||||||
|
|
||||||
typedef grub_err_t (*grub_ntfscomp_func_t) (struct grub_ntfs_attr * at,
|
typedef grub_err_t (*grub_ntfscomp_func_t) (struct grub_ntfs_attr * at,
|
||||||
char *dest,
|
char *dest,
|
||||||
grub_uint32_t ofs,
|
grub_disk_addr_t ofs,
|
||||||
grub_uint32_t len,
|
grub_size_t len,
|
||||||
struct grub_ntfs_rlst * ctx,
|
struct grub_ntfs_rlst * ctx,
|
||||||
grub_uint32_t vcn);
|
grub_disk_addr_t vcn);
|
||||||
|
|
||||||
extern grub_ntfscomp_func_t grub_ntfscomp_func;
|
extern grub_ntfscomp_func_t grub_ntfscomp_func;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue