lmkd: Protect against buffer overflow
We're passing a 'line' whose backing buffer is PAGE_MAX in size into memory_stat_parse_line(). We protect overflowing the smaller LINE_MAX 'key' buffer via some C preprocessing macros to assure we limit the size. Test: Local build with LMKD_LOG_STATS set for this file. Bug: 76220622 Change-Id: I9e50d4270f7099e37a9bfc7fb9b9b95cc7adb086
This commit is contained in:
parent
6afff4243c
commit
1d721caddc
7
lmkd.c
7
lmkd.c
|
|
@ -80,6 +80,9 @@
|
||||||
/* Defined as ProcessList.SYSTEM_ADJ in ProcessList.java */
|
/* Defined as ProcessList.SYSTEM_ADJ in ProcessList.java */
|
||||||
#define SYSTEM_ADJ (-900)
|
#define SYSTEM_ADJ (-900)
|
||||||
|
|
||||||
|
#define STRINGIFY(x) STRINGIFY_INTERNAL(x)
|
||||||
|
#define STRINGIFY_INTERNAL(x) #x
|
||||||
|
|
||||||
/* default to old in-kernel interface if no memory pressure events */
|
/* default to old in-kernel interface if no memory pressure events */
|
||||||
static int use_inkernel_interface = 1;
|
static int use_inkernel_interface = 1;
|
||||||
static bool has_inkernel_module;
|
static bool has_inkernel_module;
|
||||||
|
|
@ -583,10 +586,10 @@ static void ctrl_connect_handler(int data __unused, uint32_t events __unused) {
|
||||||
|
|
||||||
#ifdef LMKD_LOG_STATS
|
#ifdef LMKD_LOG_STATS
|
||||||
static void memory_stat_parse_line(char *line, struct memory_stat *mem_st) {
|
static void memory_stat_parse_line(char *line, struct memory_stat *mem_st) {
|
||||||
char key[LINE_MAX];
|
char key[LINE_MAX + 1];
|
||||||
int64_t value;
|
int64_t value;
|
||||||
|
|
||||||
sscanf(line,"%s %" SCNd64 "", key, &value);
|
sscanf(line, "%" STRINGIFY(LINE_MAX) "s %" SCNd64 "", key, &value);
|
||||||
|
|
||||||
if (strcmp(key, "total_") < 0) {
|
if (strcmp(key, "total_") < 0) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue