firewire: core: fix upper bound of possible CSR allocations
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Fri, 23 Jul 2010 11:02:54 +0000 (13:02 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Fri, 23 Jul 2010 11:36:28 +0000 (13:36 +0200)
region->end is defined as an upper bound of the requested address range,
exclusive --- i.e. as an address outside of the range in which the
requested CSR is to be placed.

Hence 0x0001,0000,0000,0000 is the biggest valid region->end, not
0x0000,ffff,ffff,fffc like the current check asserted.

For simplicity, the fix drops the region->end & 3 test because there is
no actual problem with these bits set in region->end.  The allocated
address range will be quadlet aligned and of a size of multiple quadlets
due to the checks for region->start & 3 and handler->length & 3 alone.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/firewire/core-transaction.c

index 6f225cacbc3da74af00913bff9c71c563d209f39..ca7ca56661e018c5ecfd9d4c56321f4dea901f93 100644 (file)
@@ -543,8 +543,8 @@ int fw_core_add_address_handler(struct fw_address_handler *handler,
        int ret = -EBUSY;
 
        if (region->start & 0xffff000000000003ULL ||
-           region->end   & 0xffff000000000003ULL ||
            region->start >= region->end ||
+           region->end   > 0x0001000000000000ULL ||
            handler->length & 3 ||
            handler->length == 0)
                return -EINVAL;