| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/renderer/renderer_sandbox_support_linux.h" | |
| 6 | |
| 7 #include <sys/stat.h> | |
| 8 | |
| 9 #include "base/eintr_wrapper.h" | |
| 10 #include "base/global_descriptors_posix.h" | |
| 11 #include "base/memory/scoped_ptr.h" | |
| 12 #include "base/pickle.h" | |
| 13 #include "content/common/chrome_descriptors.h" | |
| 14 #include "content/common/sandbox_methods_linux.h" | |
| 15 #include "content/common/unix_domain_socket_posix.h" | |
| 16 | |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/linux/WebFontRenderSt
yle.h" | |
| 18 | |
| 19 static int GetSandboxFD() { | |
| 20 return kSandboxIPCChannel + base::GlobalDescriptors::kBaseDescriptor; | |
| 21 } | |
| 22 | |
| 23 namespace renderer_sandbox_support { | |
| 24 | |
| 25 std::string getFontFamilyForCharacters(const uint16_t* utf16, | |
| 26 size_t num_utf16, | |
| 27 const char* preferred_locale) { | |
| 28 Pickle request; | |
| 29 request.WriteInt(LinuxSandbox::METHOD_GET_FONT_FAMILY_FOR_CHARS); | |
| 30 request.WriteInt(num_utf16); | |
| 31 for (size_t i = 0; i < num_utf16; ++i) | |
| 32 request.WriteUInt32(utf16[i]); | |
| 33 request.WriteString(preferred_locale); | |
| 34 | |
| 35 uint8_t buf[512]; | |
| 36 const ssize_t n = UnixDomainSocket::SendRecvMsg(GetSandboxFD(), buf, | |
| 37 sizeof(buf), NULL, request); | |
| 38 | |
| 39 std::string family_name; | |
| 40 if (n != -1) { | |
| 41 Pickle reply(reinterpret_cast<char*>(buf), n); | |
| 42 void* pickle_iter = NULL; | |
| 43 reply.ReadString(&pickle_iter, &family_name); | |
| 44 } | |
| 45 | |
| 46 return family_name; | |
| 47 } | |
| 48 | |
| 49 void getRenderStyleForStrike(const char* family, int sizeAndStyle, | |
| 50 WebKit::WebFontRenderStyle* out) { | |
| 51 Pickle request; | |
| 52 request.WriteInt(LinuxSandbox::METHOD_GET_STYLE_FOR_STRIKE); | |
| 53 request.WriteString(family); | |
| 54 request.WriteInt(sizeAndStyle); | |
| 55 | |
| 56 uint8_t buf[512]; | |
| 57 const ssize_t n = UnixDomainSocket::SendRecvMsg(GetSandboxFD(), buf, | |
| 58 sizeof(buf), NULL, request); | |
| 59 | |
| 60 out->setDefaults(); | |
| 61 if (n == -1) { | |
| 62 return; | |
| 63 } | |
| 64 | |
| 65 Pickle reply(reinterpret_cast<char*>(buf), n); | |
| 66 void* pickle_iter = NULL; | |
| 67 int useBitmaps, useAutoHint, useHinting, hintStyle, useAntiAlias, useSubpixel; | |
| 68 if (reply.ReadInt(&pickle_iter, &useBitmaps) && | |
| 69 reply.ReadInt(&pickle_iter, &useAutoHint) && | |
| 70 reply.ReadInt(&pickle_iter, &useHinting) && | |
| 71 reply.ReadInt(&pickle_iter, &hintStyle) && | |
| 72 reply.ReadInt(&pickle_iter, &useAntiAlias) && | |
| 73 reply.ReadInt(&pickle_iter, &useSubpixel)) { | |
| 74 out->useBitmaps = useBitmaps; | |
| 75 out->useAutoHint = useAutoHint; | |
| 76 out->useHinting = useHinting; | |
| 77 out->hintStyle = hintStyle; | |
| 78 out->useAntiAlias = useAntiAlias; | |
| 79 out->useSubpixel = useSubpixel; | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 int MakeSharedMemorySegmentViaIPC(size_t length, bool executable) { | |
| 84 Pickle request; | |
| 85 request.WriteInt(LinuxSandbox::METHOD_MAKE_SHARED_MEMORY_SEGMENT); | |
| 86 request.WriteUInt32(length); | |
| 87 uint8_t reply_buf[10]; | |
| 88 int result_fd; | |
| 89 ssize_t result = UnixDomainSocket::SendRecvMsg(GetSandboxFD(), | |
| 90 reply_buf, sizeof(reply_buf), | |
| 91 &result_fd, request); | |
| 92 if (result == -1) | |
| 93 return -1; | |
| 94 return result_fd; | |
| 95 } | |
| 96 | |
| 97 int MatchFontWithFallback(const std::string& face, bool bold, | |
| 98 bool italic, int charset) { | |
| 99 Pickle request; | |
| 100 request.WriteInt(LinuxSandbox::METHOD_MATCH_WITH_FALLBACK); | |
| 101 request.WriteString(face); | |
| 102 request.WriteBool(bold); | |
| 103 request.WriteBool(italic); | |
| 104 request.WriteUInt32(charset); | |
| 105 uint8_t reply_buf[64]; | |
| 106 int fd = -1; | |
| 107 UnixDomainSocket::SendRecvMsg(GetSandboxFD(), reply_buf, sizeof(reply_buf), | |
| 108 &fd, request); | |
| 109 return fd; | |
| 110 } | |
| 111 | |
| 112 bool GetFontTable(int fd, uint32_t table, uint8_t* output, | |
| 113 size_t* output_length) { | |
| 114 if (table == 0) { | |
| 115 struct stat st; | |
| 116 if (fstat(fd, &st) < 0) | |
| 117 return false; | |
| 118 size_t length = st.st_size; | |
| 119 if (!output) { | |
| 120 *output_length = length; | |
| 121 return true; | |
| 122 } | |
| 123 if (*output_length < length) | |
| 124 return false; | |
| 125 *output_length = length; | |
| 126 ssize_t n = HANDLE_EINTR(pread(fd, output, length, 0)); | |
| 127 if (n != static_cast<ssize_t>(length)) | |
| 128 return false; | |
| 129 return true; | |
| 130 } | |
| 131 | |
| 132 unsigned num_tables; | |
| 133 uint8_t num_tables_buf[2]; | |
| 134 | |
| 135 ssize_t n = HANDLE_EINTR(pread(fd, &num_tables_buf, sizeof(num_tables_buf), | |
| 136 4 /* skip the font type */)); | |
| 137 if (n != sizeof(num_tables_buf)) | |
| 138 return false; | |
| 139 | |
| 140 num_tables = static_cast<unsigned>(num_tables_buf[0]) << 8 | | |
| 141 num_tables_buf[1]; | |
| 142 | |
| 143 // The size in bytes of an entry in the table directory. | |
| 144 static const unsigned kTableEntrySize = 16; | |
| 145 scoped_array<uint8_t> table_entries( | |
| 146 new uint8_t[num_tables * kTableEntrySize]); | |
| 147 n = HANDLE_EINTR(pread(fd, table_entries.get(), num_tables * kTableEntrySize, | |
| 148 12 /* skip the SFNT header */)); | |
| 149 if (n != static_cast<ssize_t>(num_tables * kTableEntrySize)) | |
| 150 return false; | |
| 151 | |
| 152 size_t offset; | |
| 153 size_t length = 0; | |
| 154 for (unsigned i = 0; i < num_tables; i++) { | |
| 155 const uint8_t* entry = table_entries.get() + i * kTableEntrySize; | |
| 156 if (memcmp(entry, &table, sizeof(table)) == 0) { | |
| 157 offset = static_cast<size_t>(entry[8]) << 24 | | |
| 158 static_cast<size_t>(entry[9]) << 16 | | |
| 159 static_cast<size_t>(entry[10]) << 8 | | |
| 160 static_cast<size_t>(entry[11]); | |
| 161 length = static_cast<size_t>(entry[12]) << 24 | | |
| 162 static_cast<size_t>(entry[13]) << 16 | | |
| 163 static_cast<size_t>(entry[14]) << 8 | | |
| 164 static_cast<size_t>(entry[15]); | |
| 165 | |
| 166 break; | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 if (!length) | |
| 171 return false; | |
| 172 | |
| 173 if (!output) { | |
| 174 *output_length = length; | |
| 175 return true; | |
| 176 } | |
| 177 | |
| 178 if (*output_length < length) | |
| 179 return false; | |
| 180 | |
| 181 *output_length = length; | |
| 182 n = HANDLE_EINTR(pread(fd, output, length, offset)); | |
| 183 if (n != static_cast<ssize_t>(length)) | |
| 184 return false; | |
| 185 | |
| 186 return true; | |
| 187 } | |
| 188 | |
| 189 } // namespace render_sandbox_support | |
| OLD | NEW |