]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fru: ops: Do not let parser to write data to not allocated space
authorMichal Simek <michal.simek@xilinx.com>
Fri, 6 Nov 2020 12:55:45 +0000 (13:55 +0100)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 20 Nov 2020 09:42:54 +0000 (10:42 +0100)
If customs fields in board area are used it will likely go over allocated
space in struct fru_board_data. That's why calculate limit of this
structure to make sure that different data is not rewritten by accident.
When limit is reached stop to record fields.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
board/xilinx/common/fru_ops.c

index affcb121aa9cf1f1597e069260edeeb29ff699dd..b4cd3d4998859de3dcfde3e42d0917ae4578e0db 100644 (file)
@@ -163,12 +163,15 @@ static int fru_parse_board(unsigned long addr)
 {
        u8 i, type;
        int len;
-       u8 *data, *term;
+       u8 *data, *term, *limit;
 
        memcpy(&fru_data.brd.ver, (void *)addr, 6);
        addr += 6;
        data = (u8 *)&fru_data.brd.manufacturer_type_len;
 
+       /* Record max structure limit not to write data over allocated space */
+       limit = data + sizeof(struct fru_board_data);
+
        for (i = 0; ; i++, data += FRU_BOARD_MAX_LEN) {
                len = fru_check_type_len(*(u8 *)addr, fru_data.brd.lang_code,
                                         &type);
@@ -178,6 +181,9 @@ static int fru_parse_board(unsigned long addr)
                if (len == -EINVAL)
                        break;
 
+               /* Stop when amount of chars is more then fields to record */
+               if (data + len > limit)
+                       break;
                /* This record type/len field */
                *data++ = *(u8 *)addr;