Report an error for S-records with less than the miniumum size
authorAlan Modra <amodra@gmail.com>
Fri, 29 Aug 2014 01:06:29 +0000 (10:36 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 29 Aug 2014 01:06:57 +0000 (10:36 +0930)
* srec.c (srec_scan): Revert last change.  Report an error for
S-records with less than the miniumum byte count.

bfd/ChangeLog
bfd/srec.c

index 6484c91df8365b27376c91cf6b2c37cd724d1b87..3e005c9caed6b2f73b7695ff362712ff99388060 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-29  Alan Modra  <amodra@gmail.com>
+
+       * srec.c (srec_scan): Revert last change.  Report an error for
+       S-records with less than the miniumum byte count.
+
 2014-08-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        * srec.c (srec_scan): Return error for 0 size.
index d979bf55564250c59597e7254ae92a767038bc27..42143c74016f3609915c061a091552ea881e1b80 100644 (file)
@@ -453,7 +453,7 @@ srec_scan (bfd *abfd)
          {
            file_ptr pos;
            char hdr[3];
-           unsigned int bytes;
+           unsigned int bytes, min_bytes;
            bfd_vma address;
            bfd_byte *data;
            unsigned char check_sum;
@@ -476,6 +476,19 @@ srec_scan (bfd *abfd)
              }
 
            check_sum = bytes = HEX (hdr + 1);
+           min_bytes = 3;
+           if (hdr[0] == '2' || hdr[0] == '8')
+             min_bytes = 4;
+           else if (hdr[0] == '3' || hdr[0] == '7')
+             min_bytes = 5;
+           if (bytes < min_bytes)
+             {
+               (*_bfd_error_handler) (_("%B:%d: byte count %d too small\n"),
+                                      abfd, lineno, bytes);
+               bfd_set_error (bfd_error_bad_value);
+               goto error_return;
+             }
+
            if (bytes * 2 > bufsize)
              {
                if (buf != NULL)
@@ -486,8 +499,7 @@ srec_scan (bfd *abfd)
                bufsize = bytes * 2;
              }
 
-           if (bytes == 0
-               || bfd_bread (buf, (bfd_size_type) bytes * 2, abfd) != bytes * 2)
+           if (bfd_bread (buf, (bfd_size_type) bytes * 2, abfd) != bytes * 2)
              goto error_return;
 
            /* Ignore the checksum byte.  */