blob: 5ff709067c6bba3bdfe122e1ed8160d9dc3d6465 [file] [log] [blame] [view]
andybonsad92aa32015-08-31 02:27:441# Linux Sandbox IPC
andybons3322f762015-08-24 21:37:092
andybonsad92aa32015-08-31 02:27:443The Sandbox IPC system is separate from the 'main' IPC system. The sandbox IPC
4is a lower level system which deals with cases where we need to route requests
5from the bottom of the call stack up into the browser.
andybons3322f762015-08-24 21:37:096
andybonsad92aa32015-08-31 02:27:447The motivating example is Skia, which uses fontconfig to load fonts. In a
8chrooted renderer we cannot access the user's fontcache, nor the font files
9themselves. However, font loading happens when we have called through WebKit,
10through Skia and into the SkFontHost. At this point, we cannot loop back around
11to use the main IPC system.
andybons3322f762015-08-24 21:37:0912
andybonsad92aa32015-08-31 02:27:4413Thus we define a small IPC system which doesn't depend on anything but `base`
14and which can make synchronous requests to the browser process.
andybons3322f762015-08-24 21:37:0915
andybonsad92aa32015-08-31 02:27:4416The [zygote](linux_zygote.md) starts with a `UNIX DGRAM` socket installed in a
17well known file descriptor slot (currently 4). Requests can be written to this
18socket which are then processed on a special "sandbox IPC" process. Requests
19have a magic `int` at the beginning giving the type of the request.
andybons3322f762015-08-24 21:37:0920
andybonsad92aa32015-08-31 02:27:4421All renderers share the same socket, so replies are delivered via a reply
22channel which is passed as part of the request. So the flow looks like:
23
241. The renderer creates a `UNIX DGRAM` socketpair.
251. The renderer writes a request to file descriptor 4 with an `SCM_RIGHTS`
26 control message containing one end of the fresh socket pair.
271. The renderer blocks reading from the other end of the fresh socketpair.
281. A special "sandbox IPC" process receives the request, processes it and
29 writes the reply to the end of the socketpair contained in the request.
301. The renderer wakes up and continues.
31
32The browser side of the processing occurs in
33`chrome/browser/renderer_host/render_sandbox_host_linux.cc`. The renderer ends
34could occur anywhere, but the browser side has to know about all the possible
35requests so that should be a good starting point.
andybons3322f762015-08-24 21:37:0936
37Here is a (possibly incomplete) list of endpoints in the renderer:
38
39### fontconfig
40
andybonsad92aa32015-08-31 02:27:4441As mentioned above, the motivating example of this is dealing with fontconfig
42from a chrooted renderer. We implement our own Skia FontHost, outside of the
43Skia tree, in `skia/ext/SkFontHost_fontconfig**`.
andybons3322f762015-08-24 21:37:0944
andybonsad92aa32015-08-31 02:27:4445There are two methods used. One for performing a match against the fontconfig
46data and one to return a file descriptor to a font file resulting from one of
47those matches. The only wrinkle is that fontconfig is a single-threaded library
48and it's already used in the browser by GTK itself.
andybons3322f762015-08-24 21:37:0949
50Thus, we have a couple of options:
andybons3322f762015-08-24 21:37:0951
andybonsad92aa32015-08-31 02:27:44521. Handle the requests on the UI thread in the browser.
531. Handle the requests in a separate address space.
54
55The original implementation did the former (handle on UI thread). This turned
56out to be a terrible idea, performance wise, so we now handle the requests on a
57dedicated process.