Skip to content

Commit 3745488

Browse files
daxtensgregkh
authored andcommitted
altera-stapl: altera_get_note: prevent write beyond end of 'key'
altera_get_note is called from altera_init, where key is kzalloc(33). When the allocation functions are annotated to allow the compiler to see the sizes of objects, and with FORTIFY_SOURCE, we see: In file included from drivers/misc/altera-stapl/altera.c:14:0: In function ‘strlcpy’, inlined from ‘altera_init’ at drivers/misc/altera-stapl/altera.c:2189:5: include/linux/string.h:378:4: error: call to ‘__write_overflow’ declared with attribute error: detected write beyond size of object passed as 1st parameter __write_overflow(); ^~~~~~~~~~~~~~~~~~ That refers to this code in altera_get_note: if (key != NULL) strlcpy(key, &p[note_strings + get_unaligned_be32( &p[note_table + (8 * i)])], length); The error triggers because the length of 'key' is 33, but the copy uses length supplied as the 'length' parameter, which is always 256. Split the size parameter into key_len and val_len, and use the appropriate length depending on what is being copied. Detected by compiler error, only compile-tested. Cc: "Igor M. Liplianin" <[email protected]> Signed-off-by: Daniel Axtens <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Kees Cook <[email protected]> Link: https://lore.kernel.org/r/202002251042.D898E67AC@keescook Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 2669b8b commit 3745488

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

drivers/misc/altera-stapl/altera.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2112,8 +2112,8 @@ static int altera_execute(struct altera_state *astate,
21122112
return status;
21132113
}
21142114

2115-
static int altera_get_note(u8 *p, s32 program_size,
2116-
s32 *offset, char *key, char *value, int length)
2115+
static int altera_get_note(u8 *p, s32 program_size, s32 *offset,
2116+
char *key, char *value, int keylen, int vallen)
21172117
/*
21182118
* Gets key and value of NOTE fields in the JBC file.
21192119
* Can be called in two modes: if offset pointer is NULL,
@@ -2170,7 +2170,7 @@ static int altera_get_note(u8 *p, s32 program_size,
21702170
&p[note_table + (8 * i) + 4])];
21712171

21722172
if (value != NULL)
2173-
strlcpy(value, value_ptr, length);
2173+
strlcpy(value, value_ptr, vallen);
21742174

21752175
}
21762176
}
@@ -2189,13 +2189,13 @@ static int altera_get_note(u8 *p, s32 program_size,
21892189
strlcpy(key, &p[note_strings +
21902190
get_unaligned_be32(
21912191
&p[note_table + (8 * i)])],
2192-
length);
2192+
keylen);
21932193

21942194
if (value != NULL)
21952195
strlcpy(value, &p[note_strings +
21962196
get_unaligned_be32(
21972197
&p[note_table + (8 * i) + 4])],
2198-
length);
2198+
vallen);
21992199

22002200
*offset = i + 1;
22012201
}
@@ -2449,7 +2449,7 @@ int altera_init(struct altera_config *config, const struct firmware *fw)
24492449
__func__, (format_version == 2) ? "Jam STAPL" :
24502450
"pre-standardized Jam 1.1");
24512451
while (altera_get_note((u8 *)fw->data, fw->size,
2452-
&offset, key, value, 256) == 0)
2452+
&offset, key, value, 32, 256) == 0)
24532453
printk(KERN_INFO "%s: NOTE \"%s\" = \"%s\"\n",
24542454
__func__, key, value);
24552455
}

0 commit comments

Comments
 (0)