1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2025-02-21 14:54:14 +01:00

Replace fscanf with faster parsing (#127)

This commit is contained in:
Peak 2023-10-07 13:45:54 -04:00 committed by GitHub
parent b5f160ffb4
commit 2fe0c36845
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -59,6 +59,7 @@ namespace SourceHook
// On linux, first check /proc/self/maps // On linux, first check /proc/self/maps
unsigned long laddr = reinterpret_cast<unsigned long>(addr); unsigned long laddr = reinterpret_cast<unsigned long>(addr);
bool bFound = false;
FILE *pF = fopen("/proc/self/maps", "r"); FILE *pF = fopen("/proc/self/maps", "r");
if (pF) { if (pF) {
// Linux /proc/self/maps -> parse // Linux /proc/self/maps -> parse
@ -67,10 +68,18 @@ namespace SourceHook
// 08048000-0804c000 r-xp 00000000 03:03 1010107 /bin/cat // 08048000-0804c000 r-xp 00000000 03:03 1010107 /bin/cat
unsigned long rlower, rupper; unsigned long rlower, rupper;
char r, w, x; char r, w, x;
while (fscanf(pF, "%lx-%lx %c%c%c", &rlower, &rupper, &r, &w, &x) != EOF) { char *buffer = NULL;
size_t bufsize = 0;
while (getline(&buffer, &bufsize, pF) != -1) {
char *addr_split;
char *prot_split;
rlower = strtoul(buffer, &addr_split, 16);
rupper = strtoul(&addr_split[1], &prot_split, 16);
// Check whether we're IN THERE! // Check whether we're IN THERE!
if (laddr >= rlower && laddr < rupper) { if (laddr >= rlower && laddr < rupper) {
fclose(pF); r = prot_split[1];
w = prot_split[2];
x = prot_split[3];
*bits = 0; *bits = 0;
if (r == 'r') if (r == 'r')
*bits |= SH_MEM_READ; *bits |= SH_MEM_READ;
@ -78,19 +87,13 @@ namespace SourceHook
*bits |= SH_MEM_WRITE; *bits |= SH_MEM_WRITE;
if (x == 'x') if (x == 'x')
*bits |= SH_MEM_EXEC; *bits |= SH_MEM_EXEC;
return true; bFound = true;
}
// Read to end of line
int c;
while ((c = fgetc(pF)) != '\n') {
if (c == EOF)
break;
}
if (c == EOF)
break; break;
}
} }
free(buffer);
fclose(pF); fclose(pF);
return false; return bFound;
} }
pF = fopen("/proc/curproc/map", "r"); pF = fopen("/proc/curproc/map", "r");
if (pF) { if (pF) {