#include <procfs.h>
#include <stdio.h>
#define ARRAY_LENGTH(array) (sizeof((array)) / sizeof(0[(array)]))
int main(void)
{
int res = 1;
FILE *fi = NULL;
prxmap_t map[32];
int found = 0;
int done = 0;
/* Obtain an address inside the stack using a dirty trick. */
uintptr_t local = (uintptr_t)&fi;
/* Open /proc/self/xmap for reading. */
fi = fopen("/proc/self/xmap", "r");
if (!fi) {
perror("fopen");
goto out;
}
/* Read the file until EOF or the stack is found. */
while (!done && !found) {
size_t i, items;
items = fread(map, sizeof(map[0]), ARRAY_LENGTH(map), fi);
if (items != ARRAY_LENGTH(map)) {
if (ferror(fi)) {
perror("fread");
goto out;
}
done = 1;
}
/* Scan the read mappings. */
for (i = 0; i < items; i++)
if (map[i].pr_vaddr <= local
&& local < map[i].pr_vaddr + map[i].pr_size) {
/* Stack was found, validate it. */
found = 1;
if ((map[i].pr_mflags & (MA_READ | MA_WRITE | MA_EXEC))
!= (MA_READ | MA_WRITE)) {
fprintf(stderr, "Incorrect stack mapping detected.\n");
goto out;
}
}
}
/* Check if the stack was indeed found. */
if (!found) {
fprintf(stderr, "Stack not found.\n");
goto out;
}
res = 0;
out:
/* Cleanup. */
if (fi)
fclose(fi);
return res;
}