fpga: xilinx: Avoid using local intermediate buffer
authorSiva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Thu, 2 Mar 2017 13:20:11 +0000 (18:50 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 2 Aug 2017 07:11:52 +0000 (09:11 +0200)
Dont use local temporary buffer for printing out the
info instead use directly from memroy. This fixes the
issue of stack corruprion due to local buffer overflow.

Signed-off-by: Siva Durga Prasad Paladugu <sivadur@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/fpga/xilinx.c

index 2cd0104d8b154b35f8c85de42e50028ad614d57a..941f30010a5437dccd3737960204ec4888ea4ebb 100644 (file)
@@ -29,7 +29,6 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
 {
        unsigned int length;
        unsigned int swapsize;
-       char buffer[80];
        unsigned char *dataptr;
        unsigned int i;
        const fpga_desc *desc;
@@ -57,10 +56,8 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
 
        length = (*dataptr << 8) + *(dataptr + 1);
        dataptr += 2;
-       for (i = 0; i < length; i++)
-               buffer[i] = *dataptr++;
-
-       printf("  design filename = \"%s\"\n", buffer);
+       printf("  design filename = \"%s\"\n", dataptr);
+       dataptr += length;
 
        /* get part number (identifier, length, string) */
        if (*dataptr++ != 0x62) {
@@ -71,23 +68,22 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
 
        length = (*dataptr << 8) + *(dataptr + 1);
        dataptr += 2;
-       for (i = 0; i < length; i++)
-               buffer[i] = *dataptr++;
 
        if (xdesc->name) {
-               i = (ulong)strstr(buffer, xdesc->name);
+               i = (ulong)strstr((char *)dataptr, xdesc->name);
                if (!i) {
                        printf("%s: Wrong bitstream ID for this device\n",
                               __func__);
                        printf("%s: Bitstream ID %s, current device ID %d/%s\n",
-                              __func__, buffer, devnum, xdesc->name);
+                              __func__, dataptr, devnum, xdesc->name);
                        return FPGA_FAIL;
                }
        } else {
                printf("%s: Please fill correct device ID to xilinx_desc\n",
                       __func__);
        }
-       printf("  part number = \"%s\"\n", buffer);
+       printf("  part number = \"%s\"\n", dataptr);
+       dataptr += length;
 
        /* get date (identifier, length, string) */
        if (*dataptr++ != 0x63) {
@@ -98,9 +94,8 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
 
        length = (*dataptr << 8) + *(dataptr+1);
        dataptr += 2;
-       for (i = 0; i < length; i++)
-               buffer[i] = *dataptr++;
-       printf("  date = \"%s\"\n", buffer);
+       printf("  date = \"%s\"\n", dataptr);
+       dataptr += length;
 
        /* get time (identifier, length, string) */
        if (*dataptr++ != 0x64) {
@@ -111,9 +106,8 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
 
        length = (*dataptr << 8) + *(dataptr+1);
        dataptr += 2;
-       for (i = 0; i < length; i++)
-               buffer[i] = *dataptr++;
-       printf("  time = \"%s\"\n", buffer);
+       printf("  time = \"%s\"\n", dataptr);
+       dataptr += length;
 
        /* get fpga data length (identifier, length) */
        if (*dataptr++ != 0x65) {