mirror of https://github.com/xzeldon/htop.git
XUtils: check for multiplication overflow in allocation size
This commit is contained in:
parent
a150a81669
commit
8c8149d146
22
XUtils.c
22
XUtils.c
|
@ -13,6 +13,7 @@ in the source distribution for its full text.
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -36,9 +37,21 @@ void* xMalloc(size_t size) {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* xMallocArray(size_t nmemb, size_t size) {
|
||||||
|
assert(nmemb > 0);
|
||||||
|
assert(size > 0);
|
||||||
|
if (SIZE_MAX / nmemb < size) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
return xMalloc(nmemb * size);
|
||||||
|
}
|
||||||
|
|
||||||
void* xCalloc(size_t nmemb, size_t size) {
|
void* xCalloc(size_t nmemb, size_t size) {
|
||||||
assert(nmemb > 0);
|
assert(nmemb > 0);
|
||||||
assert(size > 0);
|
assert(size > 0);
|
||||||
|
if (SIZE_MAX / nmemb < size) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
void* data = calloc(nmemb, size);
|
void* data = calloc(nmemb, size);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
fail();
|
fail();
|
||||||
|
@ -56,6 +69,15 @@ void* xRealloc(void* ptr, size_t size) {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* xReallocArray(void* ptr, size_t nmemb, size_t size) {
|
||||||
|
assert(nmemb > 0);
|
||||||
|
assert(size > 0);
|
||||||
|
if (SIZE_MAX / nmemb < size) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
return xRealloc(ptr, nmemb * size);
|
||||||
|
}
|
||||||
|
|
||||||
char* String_cat(const char* s1, const char* s2) {
|
char* String_cat(const char* s1, const char* s2) {
|
||||||
const size_t l1 = strlen(s1);
|
const size_t l1 = strlen(s1);
|
||||||
const size_t l2 = strlen(s2);
|
const size_t l2 = strlen(s2);
|
||||||
|
|
4
XUtils.h
4
XUtils.h
|
@ -23,10 +23,14 @@ void fail(void) ATTR_NORETURN;
|
||||||
|
|
||||||
void* xMalloc(size_t size);
|
void* xMalloc(size_t size);
|
||||||
|
|
||||||
|
void* xMallocArray(size_t nmemb, size_t size);
|
||||||
|
|
||||||
void* xCalloc(size_t nmemb, size_t size);
|
void* xCalloc(size_t nmemb, size_t size);
|
||||||
|
|
||||||
void* xRealloc(void* ptr, size_t size);
|
void* xRealloc(void* ptr, size_t size);
|
||||||
|
|
||||||
|
void* xReallocArray(void* ptr, size_t nmemb, size_t size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* String_startsWith gives better performance if strlen(match) can be computed
|
* String_startsWith gives better performance if strlen(match) can be computed
|
||||||
* at compile time (e.g. when they are immutable string literals). :)
|
* at compile time (e.g. when they are immutable string literals). :)
|
||||||
|
|
|
@ -102,7 +102,7 @@ static void LinuxProcessList_initTtyDrivers(LinuxProcessList* this) {
|
||||||
|
|
||||||
int numDrivers = 0;
|
int numDrivers = 0;
|
||||||
int allocd = 10;
|
int allocd = 10;
|
||||||
ttyDrivers = xMalloc(sizeof(TtyDriver) * allocd);
|
ttyDrivers = xMallocArray(allocd, sizeof(TtyDriver));
|
||||||
char* at = buf;
|
char* at = buf;
|
||||||
while (*at != '\0') {
|
while (*at != '\0') {
|
||||||
at = strchr(at, ' '); // skip first token
|
at = strchr(at, ' '); // skip first token
|
||||||
|
@ -136,7 +136,7 @@ static void LinuxProcessList_initTtyDrivers(LinuxProcessList* this) {
|
||||||
numDrivers++;
|
numDrivers++;
|
||||||
if (numDrivers == allocd) {
|
if (numDrivers == allocd) {
|
||||||
allocd += 10;
|
allocd += 10;
|
||||||
ttyDrivers = xRealloc(ttyDrivers, sizeof(TtyDriver) * allocd);
|
ttyDrivers = xReallocArray(ttyDrivers, allocd, sizeof(TtyDriver));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
numDrivers++;
|
numDrivers++;
|
||||||
|
|
Loading…
Reference in New Issue