50 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#include <syscall.h>3#include <errno.h>4#include <stdio.h>5#include <stdlib.h>6#include <asm-generic/unistd.h>7 8static int mlock2_(void *start, size_t len, int flags)9{10 return syscall(__NR_mlock2, start, len, flags);11}12 13static FILE *seek_to_smaps_entry(unsigned long addr)14{15 FILE *file;16 char *line = NULL;17 size_t size = 0;18 unsigned long start, end;19 char perms[5];20 unsigned long offset;21 char dev[32];22 unsigned long inode;23 char path[BUFSIZ];24 25 file = fopen("/proc/self/smaps", "r");26 if (!file)27 ksft_exit_fail_msg("fopen smaps: %s\n", strerror(errno));28 29 while (getline(&line, &size, file) > 0) {30 if (sscanf(line, "%lx-%lx %s %lx %s %lu %s\n",31 &start, &end, perms, &offset, dev, &inode, path) < 6)32 goto next;33 34 if (start <= addr && addr < end)35 goto out;36 37next:38 free(line);39 line = NULL;40 size = 0;41 }42 43 fclose(file);44 file = NULL;45 46out:47 free(line);48 return file;49}50