/* sys_close_range is not around for long time, so let's * make sure we can call it on systems with older glibc
*/ #ifndef __NR_close_range #ifdef __alpha__ #define __NR_close_range 546 #else #define __NR_close_range 436 #endif #endif
ret = set_pathname(pipefd[0], pid); if (CHECK(ret < 0, "trigger", "set_pathname failed for pipe[0]\n")) goto out_close;
ret = set_pathname(pipefd[1], pid); if (CHECK(ret < 0, "trigger", "set_pathname failed for pipe[1]\n")) goto out_close;
ret = set_pathname(sockfd, pid); if (CHECK(ret < 0, "trigger", "set_pathname failed for socket\n")) goto out_close;
ret = set_pathname(procfd, pid); if (CHECK(ret < 0, "trigger", "set_pathname failed for proc\n")) goto out_close;
ret = set_pathname(devfd, pid); if (CHECK(ret < 0, "trigger", "set_pathname failed for dev\n")) goto out_close;
ret = set_pathname(localfd, pid); if (CHECK(ret < 0, "trigger", "set_pathname failed for file\n")) goto out_close;
ret = set_pathname(indicatorfd, pid); if (CHECK(ret < 0, "trigger", "set_pathname failed for dir\n")) goto out_close;
out_close: /* sys_close no longer triggers filp_close, but we can * call sys_close_range instead which still does
*/ #define close(fd) syscall(__NR_close_range, fd, fd, 0)
err = trigger_fstat_events(bss->my_pid); if (err < 0) goto cleanup;
if (CHECK(!bss->called_stat, "stat", "trampoline for security_inode_getattr was not called\n")) goto cleanup;
if (CHECK(!bss->called_close, "close", "trampoline for filp_close was not called\n")) goto cleanup;
for (int i = 0; i < MAX_FILES; i++) {
CHECK(strncmp(src.paths[i], bss->paths_stat[i], MAX_PATH_LEN), "check", "failed to get stat path[%d]: %s vs %s\n",
i, src.paths[i], bss->paths_stat[i]);
CHECK(strncmp(src.paths[i], bss->paths_close[i], MAX_PATH_LEN), "check", "failed to get close path[%d]: %s vs %s\n",
i, src.paths[i], bss->paths_close[i]); /* The d_path helper returns size plus NUL char, hence + 1 */
CHECK(bss->rets_stat[i] != strlen(bss->paths_stat[i]) + 1, "check", "failed to match stat return [%d]: %d vs %zd [%s]\n",
i, bss->rets_stat[i], strlen(bss->paths_stat[i]) + 1,
bss->paths_stat[i]);
CHECK(bss->rets_close[i] != strlen(bss->paths_stat[i]) + 1, "check", "failed to match stat return [%d]: %d vs %zd [%s]\n",
i, bss->rets_close[i], strlen(bss->paths_close[i]) + 1,
bss->paths_stat[i]);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.