Apple iPod nanos have sector sizes of 2 or 4 KiB, which crashes U-Boot when it
tries to read the MBR into 512-byte buffer situated on stack. Instead allocate
this buffer dynamically to be safe with any large sector size.

Signed-off-by: Sergei Shtylyov <sshtyl...@ru.mvista.com>

---
The same change is probably needed for disk/part_amiga.c but I'm not really
sure if Amiga supports USB... :-)

 disk/part_dos.c |   59 +++++++++++++++++++++++++++++++++++++++-----------------
 disk/part_dos.h |    7 ------
 2 files changed, 42 insertions(+), 24 deletions(-)

Index: u-boot/disk/part_dos.c
===================================================================
--- u-boot.orig/disk/part_dos.c
+++ u-boot/disk/part_dos.c
@@ -32,6 +32,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <exports.h>
 #include <ide.h>
 #include "part_dos.h"
 
@@ -87,14 +88,20 @@ static int test_block_type(unsigned char
 
 int test_part_dos (block_dev_desc_t *dev_desc)
 {
-       unsigned char buffer[DEFAULT_SECTOR_SIZE];
+       unsigned char *buffer;
+
+       buffer = malloc(dev_desc->blksz);
+       if (!buffer)
+               return -1;
 
        if ((dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1) 
||
            (buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) ||
            (buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) {
-               return (-1);
+               free(buffer);
+               return -1;
        }
-       return (0);
+       free(buffer);
+       return 0;
 }
 
 /*  Print a partition that is relative to its Extended partition table
@@ -102,26 +109,32 @@ int test_part_dos (block_dev_desc_t *dev
 static void print_partition_extended (block_dev_desc_t *dev_desc, int 
ext_part_sector, int relative,
                                                           int part_num)
 {
-       unsigned char buffer[DEFAULT_SECTOR_SIZE];
+       unsigned char *buffer;
        dos_partition_t *pt;
        int i;
 
+       buffer = malloc(dev_desc->blksz);
+       if (!buffer) {
+               printf ("** Can't allocate buffer **\n");
+               return;
+       }
+
        if (dev_desc->block_read(dev_desc->dev, ext_part_sector, 1, (ulong *) 
buffer) != 1) {
                printf ("** Can't read partition table on %d:%d **\n",
                        dev_desc->dev, ext_part_sector);
-               return;
+               goto exit;
        }
        i=test_block_type(buffer);
        if(i==-1) {
                printf ("bad MBR sector signature 0x%02x%02x\n",
                        buffer[DOS_PART_MAGIC_OFFSET],
                        buffer[DOS_PART_MAGIC_OFFSET + 1]);
-               return;
+               goto exit;
        }
        if(i==DOS_PBR) {
                printf ("    1\t\t         0\t%10ld\t%2x\n",
                        dev_desc->lba, buffer[DOS_PBR_MEDIA_TYPE_OFFSET]);
-               return;
+               goto exit;
        }
        /* Print all primary/logical partitions */
        pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
@@ -156,7 +169,8 @@ static void print_partition_extended (bl
                }
        }
 
-       return;
+exit:
+       free(buffer);
 }
 
 
@@ -166,21 +180,27 @@ static int get_partition_info_extended (
                                 int relative, int part_num,
                                 int which_part, disk_partition_t *info)
 {
-       unsigned char buffer[DEFAULT_SECTOR_SIZE];
+       unsigned char *buffer;
        dos_partition_t *pt;
-       int i;
+       int i, result = -1;
+
+       buffer = malloc(dev_desc->blksz);
+       if (!buffer) {
+               printf ("** Can't allocate buffer **\n");
+               return -1;
+       }
 
        if (dev_desc->block_read (dev_desc->dev, ext_part_sector, 1, (ulong *) 
buffer) != 1) {
                printf ("** Can't read partition table on %d:%d **\n",
                        dev_desc->dev, ext_part_sector);
-               return -1;
+               goto exit;
        }
        if (buffer[DOS_PART_MAGIC_OFFSET] != 0x55 ||
                buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) {
                printf ("bad MBR sector signature 0x%02x%02x\n",
                        buffer[DOS_PART_MAGIC_OFFSET],
                        buffer[DOS_PART_MAGIC_OFFSET + 1]);
-               return -1;
+               goto exit;
        }
 
        /* Print all primary/logical partitions */
@@ -223,7 +243,8 @@ static int get_partition_info_extended (
                        }
                        /* sprintf(info->type, "%d, pt->sys_ind); */
                        sprintf ((char *)info->type, "U-Boot");
-                       return 0;
+                       result = 0;
+                       goto exit;
                }
 
                /* Reverse engr the fdisk part# assignment rule! */
@@ -239,12 +260,16 @@ static int get_partition_info_extended (
                if (is_extended (pt->sys_ind)) {
                        int lba_start = le32_to_int (pt->start4) + relative;
 
-                       return get_partition_info_extended (dev_desc, lba_start,
-                                ext_part_sector == 0 ? lba_start : relative,
-                                part_num, which_part, info);
+                       result = get_partition_info_extended(dev_desc,
+                                       lba_start, ext_part_sector == 0 ?
+                                               lba_start : relative,
+                                       part_num, which_part, info);
+                       goto exit;
                }
        }
-       return -1;
+exit:
+       free(buffer);
+       return result;
 }
 
 void print_part_dos (block_dev_desc_t *dev_desc)
Index: u-boot/disk/part_dos.h
===================================================================
--- u-boot.orig/disk/part_dos.h
+++ u-boot/disk/part_dos.h
@@ -25,13 +25,6 @@
 #define _DISK_PART_DOS_H
 
 
-#ifdef CONFIG_ISO_PARTITION
-/* Make the buffers bigger if ISO partition support is enabled -- CD-ROMS
-   have 2048 byte blocks */
-#define DEFAULT_SECTOR_SIZE    2048
-#else
-#define DEFAULT_SECTOR_SIZE    512
-#endif
 #define DOS_PART_TBL_OFFSET    0x1be
 #define DOS_PART_MAGIC_OFFSET  0x1fe
 #define DOS_PBR_FSTYPE_OFFSET  0x36
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to