a5bd9f6
From ee4b14ff422b784baa941c80613c79b8ab5140ea Mon Sep 17 00:00:00 2001
a5bd9f6
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
a5bd9f6
Date: Sun, 10 Mar 2013 18:27:53 +0100
a5bd9f6
Subject: [PATCH 201/364] 	* grub-core/fs/hfs.c (grub_hfs_read_file):
a5bd9f6
 Avoid divmod64 since the 	maximum size is 4G - 1 on hfs
a5bd9f6
a5bd9f6
---
a5bd9f6
 ChangeLog          |  5 +++++
a5bd9f6
 grub-core/fs/hfs.c | 15 ++++++++-------
a5bd9f6
 2 files changed, 13 insertions(+), 7 deletions(-)
a5bd9f6
a5bd9f6
diff --git a/ChangeLog b/ChangeLog
a5bd9f6
index bc51ae9..931ae8e 100644
a5bd9f6
--- a/ChangeLog
a5bd9f6
+++ b/ChangeLog
a5bd9f6
@@ -1,5 +1,10 @@
a5bd9f6
 2013-03-10  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
 
a5bd9f6
+	* grub-core/fs/hfs.c (grub_hfs_read_file): Avoid divmod64 since the
a5bd9f6
+	maximum size is 4G - 1 on hfs
a5bd9f6
+
a5bd9f6
+2013-03-10  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
+
a5bd9f6
 	Avoid costly 64-bit division in grub_get_time_ms on most platforms.
a5bd9f6
 
a5bd9f6
 2013-03-10  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
diff --git a/grub-core/fs/hfs.c b/grub-core/fs/hfs.c
a5bd9f6
index 73ac7f9..14520c0 100644
a5bd9f6
--- a/grub-core/fs/hfs.c
a5bd9f6
+++ b/grub-core/fs/hfs.c
a5bd9f6
@@ -244,15 +244,16 @@ grub_hfs_block (struct grub_hfs_data *data, grub_hfs_datarecord_t dat,
a5bd9f6
 static grub_ssize_t
a5bd9f6
 grub_hfs_read_file (struct grub_hfs_data *data,
a5bd9f6
 		    grub_disk_read_hook_t read_hook, void *read_hook_data,
a5bd9f6
-		    grub_off_t pos, grub_size_t len, char *buf)
a5bd9f6
+		    grub_uint32_t pos, grub_size_t len, char *buf)
a5bd9f6
 {
a5bd9f6
   grub_off_t i;
a5bd9f6
   grub_off_t blockcnt;
a5bd9f6
 
a5bd9f6
-  blockcnt = grub_divmod64 (((len + pos)
a5bd9f6
-			     + data->blksz - 1), data->blksz, 0);
a5bd9f6
+  /* Files are at most 2G/4G - 1 bytes on hfs. Avoid 64-bit division.
a5bd9f6
+     Moreover len > 0 as checked in upper layer.  */
a5bd9f6
+  blockcnt = (len + pos - 1) / data->blksz + 1;
a5bd9f6
 
a5bd9f6
-  for (i = grub_divmod64 (pos, data->blksz, 0); i < blockcnt; i++)
a5bd9f6
+  for (i = pos / data->blksz; i < blockcnt; i++)
a5bd9f6
     {
a5bd9f6
       grub_disk_addr_t blknr;
a5bd9f6
       grub_off_t blockoff;
a5bd9f6
@@ -260,7 +261,7 @@ grub_hfs_read_file (struct grub_hfs_data *data,
a5bd9f6
 
a5bd9f6
       int skipfirst = 0;
a5bd9f6
 
a5bd9f6
-      grub_divmod64 (pos, data->blksz, &blockoff);
a5bd9f6
+      blockoff = pos % data->blksz;
a5bd9f6
 
a5bd9f6
       blknr = grub_hfs_block (data, data->extents, data->fileid, i, 1);
a5bd9f6
       if (grub_errno)
a5bd9f6
@@ -269,7 +270,7 @@ grub_hfs_read_file (struct grub_hfs_data *data,
a5bd9f6
       /* Last block.  */
a5bd9f6
       if (i == blockcnt - 1)
a5bd9f6
 	{
a5bd9f6
-	  grub_divmod64 ((len + pos), data->blksz, &blockend);
a5bd9f6
+	  blockend = (len + pos) % data->blksz;
a5bd9f6
 
a5bd9f6
 	  /* The last portion is exactly EXT2_BLOCK_SIZE (data).  */
a5bd9f6
 	  if (! blockend)
a5bd9f6
@@ -277,7 +278,7 @@ grub_hfs_read_file (struct grub_hfs_data *data,
a5bd9f6
 	}
a5bd9f6
 
a5bd9f6
       /* First block.  */
a5bd9f6
-      if (i == grub_divmod64 (pos, data->blksz, 0))
a5bd9f6
+      if (i == pos / data->blksz)
a5bd9f6
 	{
a5bd9f6
 	  skipfirst = blockoff;
a5bd9f6
 	  blockend -= skipfirst;
a5bd9f6
-- 
a5bd9f6
1.8.1.4
a5bd9f6