altoslib: Fix data fetching during flashing of cc1111-based devices
authorKeith Packard <keithp@keithp.com>
Fri, 27 Apr 2018 00:24:51 +0000 (17:24 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 27 Apr 2018 02:24:21 +0000 (19:24 -0700)
We want to get enough information about the target device to verify
that the new firmware matches, so fetch 512 bytes instead of just
barely enough to cover the romconfig data.

Also catch out-of-bounds accesses and handle them, in case even this
large array isn't enough.

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosDebug.java
altoslib/AltosHexfile.java
altoslib/AltosRomconfig.java

index 24a2593303c0f4bc16bbee37debaf73527208d83..a44eb12fc002fd93589ce4278b16c2ee26a5ce3f 100644 (file)
@@ -264,8 +264,8 @@ public class AltosDebug {
 
        public AltosRomconfig romconfig() throws InterruptedException {
                try {
-                       byte[] bytes = read_memory(0xa0, 10);
-                       AltosHexfile hexfile = new AltosHexfile (bytes, 0xa0);
+                       byte[] bytes = read_memory(0x00, 0x200);
+                       AltosHexfile hexfile = new AltosHexfile (bytes, 0x00);
                        return new AltosRomconfig(hexfile);
                } catch (IOException ie) {
                }
index 6aa98383e9fc38d92d93b928a97d4990c6fc8258..f2ab4bead5c3883dd8cd1e16d5020b8cf63eb484 100644 (file)
@@ -294,15 +294,19 @@ public class AltosHexfile {
                if (usb_descriptors == null)
                        return -1;
 
-               /* Walk the descriptors looking for the device */
-               a = usb_descriptors.address;
-               while (get_u8(a+1) != AO_USB_DESC_DEVICE) {
-                       int delta = get_u8(a);
-                       a += delta;
-                       if (delta == 0 || a >= max_address)
-                               return -1;
+               try {
+                       /* Walk the descriptors looking for the device */
+                       a = usb_descriptors.address;
+                       while (get_u8(a+1) != AO_USB_DESC_DEVICE) {
+                               int delta = get_u8(a);
+                               a += delta;
+                               if (delta == 0 || a >= max_address)
+                                       return -1;
+                       }
+                       return a;
+               } catch (ArrayIndexOutOfBoundsException ae) {
+                       return -1;
                }
-               return a;
        }
 
        public AltosUsbId find_usb_id() {
index 1fbb411540c534601631735949c7cddc55b3489b..44a3fa6097fc8d376394824614cab76edd493c81 100644 (file)
@@ -35,12 +35,12 @@ public class AltosRomconfig {
                        System.out.printf("no symbol %s\n", name);
                        throw new AltosNoSymbol(name);
                }
-               if (hexfile.address <= symbol.address && symbol.address + len < hexfile.max_address) {
+               if (hexfile.address <= symbol.address && symbol.address + len <= hexfile.max_address) {
                        System.out.printf("%s: %x\n", name, symbol.address);
                        return symbol.address;
                }
-               System.out.printf("invalid symbol addr %x range is %x - %x\n",
-                                 symbol.address, hexfile.address, hexfile.max_address);
+               System.out.printf("invalid symbol addr %x len %d range is %x - %x\n",
+                                 symbol.address, len, hexfile.address, hexfile.max_address);
                throw new AltosNoSymbol(name);
        }