Linux Sandbox IPC

The Sandbox IPC system is separate from the ‘main’ IPC system. The sandbox IPC is a lower level system which deals with cases where we need to route requests from the bottom of the call stack up into the browser.

The motivating example is Skia, which uses fontconfig to load fonts. In a chrooted renderer we cannot access the user's fontcache, nor the font files themselves. However, font loading happens when we have called through WebKit, through Skia and into the SkFontHost. At this point, we cannot loop back around to use the main IPC system.

Thus we define a small IPC system which doesn't depend on anything but base and which can make synchronous requests to the browser process.

The zygote starts with a UNIX DGRAM socket installed in a well known file descriptor slot (currently 4). Requests can be written to this socket which are then processed on a special “sandbox IPC” process. Requests have a magic int at the beginning giving the type of the request.

All renderers share the same socket, so replies are delivered via a reply channel which is passed as part of the request. So the flow looks like:

  1. The renderer creates a UNIX DGRAM socketpair.
  2. The renderer writes a request to file descriptor 4 with an SCM_RIGHTS control message containing one end of the fresh socket pair.
  3. The renderer blocks reading from the other end of the fresh socketpair.
  4. A special “sandbox IPC” process receives the request, processes it and writes the reply to the end of the socketpair contained in the request.
  5. The renderer wakes up and continues.

The browser side of the processing occurs in chrome/browser/renderer_host/render_sandbox_host_linux.cc. The renderer ends could occur anywhere, but the browser side has to know about all the possible requests so that should be a good starting point.

Here is a (possibly incomplete) list of endpoints in the renderer:

fontconfig

As mentioned above, the motivating example of this is dealing with fontconfig from a chrooted renderer. We implement our own Skia FontHost, outside of the Skia tree, in skia/ext/SkFontHost_fontconfig**.

There are two methods used. One for performing a match against the fontconfig data and one to return a file descriptor to a font file resulting from one of those matches. The only wrinkle is that fontconfig is a single-threaded library and it's already used in the browser by GTK itself.

Thus, we have a couple of options:

  1. Handle the requests on the UI thread in the browser.
  2. Handle the requests in a separate address space.

The original implementation did the former (handle on UI thread). This turned out to be a terrible idea, performance wise, so we now handle the requests on a dedicated process.