public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: egbert.eich at googlemail.com <egbert.eich@googlemail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] disk: part_dos: check harder for partition table.
Date: Tue, 26 Mar 2013 05:06:05 -0400	[thread overview]
Message-ID: <1364288765-2637-1-git-send-email-egbert.eich@gmail.com> (raw)

From: Egbert Eich <eich@suse.com>

Devices that used to have a whole disk FAT filesystem but got then
partitioned will most likely still have a FAT or FAT32 signature
in the first sector as this sector does not get overwritten by
a partitioning tool (otherwise the tool would risk to kill the mbr).

The current partition search algorithm will erronosly detect such
a device as a raw FAT device.

Instead of looking for the FAT or FAT32 signatures immediately we
use the same algorithm as used by the Linux kernel and first check
for a valid boot indicator flag on each of the 4 partitions.
If the value of this flag is invalid for the first entry we then
do the raw partition check.
If the flag for any higher partition is wrong we assume the device
is neiter a MBR nor PBR device.

Signed-off-by: Egbert Eich <eich@suse.com>
---
 disk/part_dos.c |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/disk/part_dos.c b/disk/part_dos.c
index 37087a6..8a23495 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -74,13 +74,23 @@ static void print_one_part(dos_partition_t *p, int ext_part_sector,
 
 static int test_block_type(unsigned char *buffer)
 {
+	int slot;
+	struct dos_partition *p;
+
 	if((buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) ||
 	    (buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) {
 		return (-1);
 	} /* no DOS Signature at all */
-	if (strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],"FAT",3)==0 ||
-	    strncmp((char *)&buffer[DOS_PBR32_FSTYPE_OFFSET],"FAT32",5)==0) {
-		return DOS_PBR; /* is PBR */
+	p = ( struct dos_partition *)&buffer[DOS_PART_TBL_OFFSET];
+	for (slot = 0; slot < 3; slot++) {
+		if (p->boot_ind != 0 && p->boot_ind != 0x80) {
+			if (!slot &&
+			    (strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],"FAT",3)==0 ||
+			     strncmp((char *)&buffer[DOS_PBR32_FSTYPE_OFFSET],"FAT32",5)==0)) {
+				return DOS_PBR; /* is PBR */
+			} else
+				return -1;
+		}
 	}
 	return DOS_MBR;	    /* Is MBR */
 }
-- 
1.7.7

             reply	other threads:[~2013-03-26  9:06 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-26  9:06 egbert.eich at googlemail.com [this message]
2013-03-26 13:04 ` [U-Boot] [PATCH] disk/part_dos: check harder for partition table Egbert Eich
2013-03-26 14:05 ` [U-Boot] [PATCH] disk: part_dos: " Wolfgang Denk
2013-04-09 15:46 ` [U-Boot] [Patch v2] disk/part_dos: " Egbert Eich
2013-05-02 16:07   ` [U-Boot] [U-Boot, " Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1364288765-2637-1-git-send-email-egbert.eich@gmail.com \
    --to=egbert.eich@googlemail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox