OLD | NEW |
---|---|
(Empty) | |
1 #include <sys/time.h> | |
2 #include <sys/resource.h> | |
3 | |
4 #include "SkCanvas.h" | |
5 #include "SkCommandLineFlags.h" | |
6 #include "SkData.h" | |
7 #include "SkForceLinking.h" | |
8 #include "SkGraphics.h" | |
9 #include "SkImageEncoder.h" | |
10 #include "SkImageInfo.h" | |
11 #include "SkStream.h" | |
12 #include "SkSurface.h" | |
13 | |
14 #include "seccomp_bpf.h" | |
15 #include "syscall_reporter.h" | |
16 | |
17 DEFINE_string(out, "", "Filename of the PNG to write to."); | |
18 DEFINE_bool(logSyscall, false, "Dump the name of the blocked syscall that was at tempted. Use only for debugging."); | |
19 | |
20 static int installSyscallFilter(void) { | |
mtklein
2014/04/08 19:00:23
Usually static methods are named_like_this
jcgregorio
2014/04/09 14:10:31
Done.
| |
21 struct sock_filter filter[] = { | |
22 /* Validate architecture. */ | |
23 VALIDATE_ARCHITECTURE, | |
24 /* Grab the system call number. */ | |
25 EXAMINE_SYSCALL, | |
26 /* List allowed syscalls. */ | |
27 ALLOW_SYSCALL(exit_group), | |
28 ALLOW_SYSCALL(exit), | |
29 ALLOW_SYSCALL(fstat), | |
30 ALLOW_SYSCALL(read), | |
31 ALLOW_SYSCALL(write), | |
32 ALLOW_SYSCALL(close), | |
33 ALLOW_SYSCALL(mmap), | |
34 ALLOW_SYSCALL(munmap), | |
35 ALLOW_SYSCALL(brk), | |
36 KILL_PROCESS, | |
37 }; | |
38 struct sock_fprog prog = { | |
39 (unsigned short)(sizeof(filter)/sizeof(filter[0])), | |
mtklein
2014/04/08 19:00:23
SK_ARRAY_COUNT?
jcgregorio
2014/04/09 14:10:31
Done.
| |
40 filter, | |
41 }; | |
42 | |
43 if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { | |
mtklein
2014/04/08 19:00:23
This function could use a bit of comment narration
jcgregorio
2014/04/09 14:10:31
Done.
| |
44 perror("prctl(NO_NEW_PRIVS)"); | |
45 goto failed; | |
46 } | |
47 if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) { | |
48 perror("prctl(SECCOMP)"); | |
49 goto failed; | |
50 } | |
51 return 0; | |
52 | |
53 failed: | |
54 if (errno == EINVAL) | |
55 fprintf(stderr, "SECCOMP_FILTER is not available. :(\n"); | |
56 return 1; | |
57 } | |
58 | |
59 void setLimits() { | |
mtklein
2014/04/08 19:00:23
static void set_limits?
jcgregorio
2014/04/09 14:10:31
Done.
| |
60 struct rlimit n; | |
61 | |
62 // Limit to 5 seconds of CPU. | |
63 n.rlim_cur = 5; | |
64 n.rlim_max = 5; | |
65 if (setrlimit(RLIMIT_CPU, &n)) { | |
66 perror("setrlimit(RLIMIT_CPU)"); | |
67 } | |
68 | |
69 // Limit to 50M of Address space. | |
70 n.rlim_cur = 50000000; | |
71 n.rlim_max = 50000000; | |
72 if (setrlimit(RLIMIT_AS, &n)) { | |
73 perror("setrlimit(RLIMIT_CPU)"); | |
74 } | |
75 } | |
76 | |
77 void draw(SkCanvas* canvas); | |
mtklein
2014/04/08 19:00:23
Can't hurt to remind us that this comes from outsi
jcgregorio
2014/04/09 14:10:31
Done.
| |
78 | |
79 int main(int argc, char** argv) { | |
80 SkCommandLineFlags::Parse(argc, argv); | |
81 SkForceLinking(false); | |
mtklein
2014/04/08 19:00:23
Typically I use the __SK_FORCE_IMAGE_DECODER_LINKI
jcgregorio
2014/04/09 14:10:31
Done.
| |
82 SkAutoGraphics init; | |
83 | |
84 SkFILEWStream stream(FLAGS_out[0]); | |
mtklein
2014/04/08 19:00:23
Bail if FLAGS_out.count() == 0?
jcgregorio
2014/04/09 14:10:31
Done.
| |
85 | |
86 SkImageInfo info = SkImageInfo::MakeN32(300, 300, kPremul_SkAlphaType); | |
87 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info)); | |
88 SkCanvas* canvas = surface->getCanvas(); | |
89 | |
90 setLimits(); | |
91 | |
92 if (FLAGS_logSyscall && install_syscall_reporter()) { | |
mtklein
2014/04/08 19:00:23
Ordinarily I'd prefer true, false over 0, 1. I gu
jcgregorio
2014/04/09 14:10:31
Done.
| |
93 return 1; | |
94 } | |
95 if (installSyscallFilter()) { | |
96 return 1; | |
97 } | |
98 | |
99 draw(canvas); | |
100 | |
101 // Write out the image as a PNG. | |
102 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); | |
mtklein
2014/04/08 19:00:23
I know it's sort of notional, but I can't help but
jcgregorio
2014/04/09 14:10:31
Yeah, I'm torn between making the code look exactl
| |
103 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kPNG_Type, 100)); | |
104 if (NULL == data.get()) { | |
105 printf("Failed to encode\n"); | |
106 exit(1); | |
107 } | |
108 stream.write(data->data(), data->size()); | |
109 } | |
OLD | NEW |