Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: experimental/webtry/syscall_reporter.cpp

Issue 228693002: Initial code for webtry, a web application for allowing users to try out Skia. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: More cleanup Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: experimental/webtry/syscall_reporter.cpp
diff --git a/experimental/webtry/syscall_reporter.cpp b/experimental/webtry/syscall_reporter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b7a49e5ab7f215e4e2a5d173cc713aa057b0aae
--- /dev/null
+++ b/experimental/webtry/syscall_reporter.cpp
@@ -0,0 +1,110 @@
+/*
jcgregorio 2014/04/09 14:10:31 Deleting this file.
+ * syscall reporting example for seccomp
+ *
+ * Copyright (c) 2012 The Chromium OS Authors <chromium-os-dev@chromium.org>
+ * Authors:
+ * Will Drewry <wad@chromium.org>
+ * Kees Cook <keescook@chromium.org>
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include <execinfo.h>
+#include <map>
+
+#include "syscall_reporter.h"
+#include "syscall_names.h"
+
+const char * const msg_needed = "Looks like you also need syscall: ";
+
+/* Since "sprintf" is technically not signal-safe, reimplement %d here. */
mtklein 2014/04/08 19:00:23 Badass
+static void write_uint(char *buf, unsigned int val)
+{
+ int width = 0;
+ unsigned int tens;
+
+ if (val == 0) {
+ strcpy(buf, "0");
+ return;
+ }
+ for (tens = val; tens; tens /= 10)
+ ++ width;
+ buf[width] = '\0';
+ for (tens = val; tens; tens /= 10)
+ buf[--width] = '0' + (tens % 10);
+}
+
+void tracer() {
+ int j, nptrs;
+#define SIZE 100
mtklein 2014/04/08 19:00:23 I'm getting the impression that this file was just
+ void *buffer[100];
+ char **strings;
+
+ nptrs = backtrace(buffer, SIZE);
+ printf("backtrace() returned %d addresses\n", nptrs);
+
+ /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
+ would produce similar output to the following: */
+
+ strings = backtrace_symbols(buffer, nptrs);
+ if (strings == NULL) {
+ perror("backtrace_symbols");
+ exit(EXIT_FAILURE);
+ }
+
+ for (j = 0; j < nptrs; j++)
+ printf("%s\n", strings[j]);
+
+ free(strings);
+}
+
+static void reporter(int nr, siginfo_t *info, void *void_context)
+{
mtklein 2014/04/08 19:00:23 This code has some of the oddest formatting I've e
+ char buf[128];
+ ucontext_t *ctx = (ucontext_t *)(void_context);
+ unsigned int syscall;
+ if (info->si_code != SYS_SECCOMP)
+ return;
+ if (!ctx)
+ return;
+ syscall = ctx->uc_mcontext.gregs[REG_SYSCALL];
+ strcpy(buf, msg_needed);
+ std::map<int, const char*>::iterator i;
+ i = syscall_names.find(syscall);
+ if (i != syscall_names.end()) {
+ strcat(buf, syscall_names[syscall]);
+ strcat(buf, "(");
+ } else {
+ strcat(buf, "Unknown call?!?");
+ }
+ write_uint(buf + strlen(buf), syscall);
+ if (i != syscall_names.end()) {
+ strcat(buf, ")");
+ }
+ strcat(buf, "\n");
+ int ret = write(STDOUT_FILENO, buf, strlen(buf));
mtklein 2014/04/08 19:00:23 WTF do these next 4 lines do?
+ tracer();
+ ret = ret;
mtklein 2014/04/08 19:00:23 Particularly WTF. Is there some implicit register
+ _exit(1);
+}
+
+int install_syscall_reporter(void) {
+ struct sigaction act;
+ syscall_names_init();
+ sigset_t mask;
+ memset(&act, 0, sizeof(act));
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGSYS);
+
+ act.sa_sigaction = &reporter;
+ act.sa_flags = SA_SIGINFO;
+ if (sigaction(SIGSYS, &act, NULL) < 0) {
+ perror("sigaction");
+ return -1;
+ }
+ if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) {
+ perror("sigprocmask");
+ return -1;
+ }
+ return 0;
+}

Powered by Google App Engine
This is Rietveld 408576698