Project: chromium Issues People Development process History Sign in
New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.
Issue 223772 Attempting free when chrome.fontSettings.getFontList is called twice in background script
Starred by 0 users Project Member Reported by meacer@google.com, Mar 25 2013 Back to list
Status: Fixed
Owner:
Closed: Apr 2013
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Linux
Pri: 1
Type: Bug-Security



Sign in to add a comment
Detailed report: https://cluster-fuzz.appspot.com/testcase?key=174003564

Fuzzer: Meacer_extension_apis

Crash Type: Attempting free
Crash Address: add
Crash State:
  - crash stack -
  base::
  base::PlatformThread::Create
  base::SimpleThread::Start
  


Additional requirements: Requires Interaction Gestures
 
Comment 1 by meacer@google.com, Mar 25 2013
Cc: erikkay@chromium.org infe...@chromium.org meacer@chromium.org
Summary: Attempting free when chrome.fontSettings.getFontList is called twice in background script (was: Attempting free in base::)
There is a chance that this is an ASAN bug, because I see the line "AddressSanitizer: while reporting a bug found another one.Ignoring." right before the stack trace.

I minimized the test case from manually. Calling chrome.fontSettings.getFontList in the background script twice hits this bug:

chrome.fontSettings.getFontList(function (results) {
});

chrome.fontSettings.getFontList(function (results) {
});


Here is the symbolized stack trace from ASAN. Looks like it points to fontconfig library.

==30891== AddressSanitizer: while reporting a bug found another one.Ignoring.
==30891== ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x6008003df6a0
    #0 0x7f2b65d83bb2 in free ??:0
    #1 0x7f2b61d2f5b7 in FcValueListDestroy /build/buildd/fontconfig-2.8.0/src/fcpat.c:135
0x6008003df6a0 is located 16 bytes inside of 33-byte region [0x6008003df690,0x6008003df6b1)
allocated by thread T33 (BrowserBlocking) here:
    #0 0x7f2b65d83c92 in malloc ??:0
    #1 0x7f2b61d30672 in FcStrStaticName /build/buildd/fontconfig-2.8.0/src/fcpat.c:1060
Thread T33 (BrowserBlocking) created by T19 (BrowserBlocking) here:
    #0 0x7f2b65d7fa54 in pthread_create ??:0
    #1 0x7f2b67b3ab75 in base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, unsigned long*, base::ThreadPriority) chromium_asan/src/out/Release/../../base/threading/platform_thread_posix.cc:164
    #2 0x7f2b67b3aa2c in base::PlatformThread::Create(unsigned long, base::PlatformThread::Delegate*, unsigned long*) chromium_asan/src/out/Release/../../base/threading/platform_thread_posix.cc:265
    #3 0x7f2b67b46a6d in base::SimpleThread::Start() chromium_asan/src/out/Release/../../base/threading/simple_thread.cc:32
    #4 0x7f2b67b3bd55 in Worker chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:475
    #5 0x7f2b67b41b11 in base::SequencedWorkerPool::Inner::FinishStartingAdditionalThread(int) chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:1073
    #6 0x7f2b67b3df5b in base::SequencedWorkerPool::Inner::ThreadLoop(base::SequencedWorkerPool::Worker*) chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:722
    #7 0x7f2b67b3c08f in base::SequencedWorkerPool::Worker::Run() chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:487
    #8 0x7f2b67b46fca in base::SimpleThread::ThreadMain() chromium_asan/src/out/Release/../../base/threading/simple_thread.cc:60
    #9 0x7f2b67b3ae1c in base::(anonymous namespace)::ThreadFunc(void*) chromium_asan/src/out/Release/../../base/threading/platform_thread_posix.cc:100
    #10 0x7f2b65d8968a in __asan::AsanThread::ThreadStart() ??:0
Thread T19 (BrowserBlocking) created by T0 (chrome) here:
    #0 0x7f2b65d7fa54 in pthread_create ??:0
    #1 0x7f2b67b3ab75 in base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, unsigned long*, base::ThreadPriority) chromium_asan/src/out/Release/../../base/threading/platform_thread_posix.cc:164
    #2 0x7f2b67b3aa2c in base::PlatformThread::Create(unsigned long, base::PlatformThread::Delegate*, unsigned long*) chromium_asan/src/out/Release/../../base/threading/platform_thread_posix.cc:265
    #3 0x7f2b67b46a6d in base::SimpleThread::Start() chromium_asan/src/out/Release/../../base/threading/simple_thread.cc:32
    #4 0x7f2b67b3bd55 in Worker chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:475
    #5 0x7f2b67b41b11 in base::SequencedWorkerPool::Inner::FinishStartingAdditionalThread(int) chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:1073
    #6 0x7f2b67b412b4 in base::SequencedWorkerPool::Inner::PostTask(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const*, base::SequencedWorkerPool::SequenceToken, base::SequencedWorkerPool::WorkerShutdown, tracked_objects::Location const&, base::Callback<void ()> const&, base::TimeDelta) chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:600
    #7 0x7f2b67b45f8e in base::SequencedWorkerPool::PostDelayedSequencedWorkerTask(base::SequencedWorkerPool::SequenceToken, tracked_objects::Location const&, base::Callback<void ()> const&, base::TimeDelta) chromium_asan/src/out/Release/../../base/threading/sequenced_worker_pool.cc:1190
    #8 0x7f2b67b38f0a in base::TaskRunner::PostTask(tracked_objects::Location const&, base::Callback<void ()> const&) chromium_asan/src/out/Release/../../base/task_runner.cc:45
    #9 0x7f2b66684903 in (anonymous namespace)::CreateProfileDirectory(base::SequencedTaskRunner*, base::FilePath const&) chromium_asan/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:184
    #10 0x7f2b66687ba5 in ProfileImpl::DoFinalInit(bool) chromium_asan/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:457
    #11 0x7f2b66687252 in ProfileImpl::OnPrefsLoaded(bool) chromium_asan/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:752
    #12 0x7f2b66686109 in ProfileImpl chromium_asan/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:425
    #13 0x7f2b6668469e in Profile::CreateProfile(base::FilePath const&, Profile::Delegate*, Profile::CreateMode) chromium_asan/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:266
    #14 0x7f2b6611d16a in ProfileManager::GetProfile(base::FilePath const&) chromium_asan/src/out/Release/../../chrome/browser/profiles/profile_manager.cc:428
    #15 0x7f2b668dce3e in ChromeBrowserMainParts::parsed_command_line() const chromium_asan/src/out/Release/../../chrome/browser/chrome_browser_main.cc:383
    #16 0x7f2b668da9d5 in ChromeBrowserMainParts::PreMainMessageLoopRun() chromium_asan/src/out/Release/../../chrome/browser/chrome_browser_main.cc:1026
    #17 0x7f2b6881e48c in content::BrowserMainLoop::CreateThreads() chromium_asan/src/out/Release/../../content/browser/browser_main_loop.cc:504
    #18 0x7f2b68b59f89 in content::BrowserMainRunnerImpl::Initialize(content::MainFunctionParams const&) chromium_asan/src/out/Release/../../content/browser/browser_main_runner.cc:111
    #19 0x7f2b6ea7a982 in content::BrowserMain(content::MainFunctionParams const&) chromium_asan/src/out/Release/../../content/browser/browser_main.cc:18
    #20 0x7f2b6bae982d in content::RunNamedProcessTypeMain(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, content::MainFunctionParams const&, content::ContentMainDelegate*) chromium_asan/src/out/Release/../../content/app/content_main_runner.cc:455
    #21 0x7f2b6baeae79 in content::ContentMainRunnerImpl::Run() chromium_asan/src/out/Release/../../content/app/content_main_runner.cc:760
    #22 0x7f2b6bae7b51 in content::ContentMain(int, char const**, content::ContentMainDelegate*) chromium_asan/src/out/Release/../../content/app/content_main.cc:35
    #23 0x7f2b65d8fb4a in ChromeMain chromium_asan/src/out/Release/../../chrome/app/chrome_main.cc:32
    #24 0x7f2b65d8fa9a in main chromium_asan/src/out/Release/../../chrome/app/chrome_exe_main_gtk.cc:34
    #25 0x7f2b5eb2d76c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
==30891== ABORTING


extension_attempting_free_minimized.zip
1.3 KB Download
Owner: falken@chromium.org
Matt, could you please check this out?  It may be a false positive, but we're investigating all of these.
Comment 3 by meacer@google.com, Mar 26 2013
FYI, I also saw the following message a few times, it may be relevant:

(chrome:7491): Pango-CRITICAL **: pango_font_family_get_name: assertion `PANGO_IS_FONT_FAMILY (family)' failed
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct null not valid
Comment 4 by kcc@chromium.org, Mar 26 2013
Cc: euge...@chromium.org glider@chromium.org
>> There is a chance that this is an ASAN bug, because I see the line 
>> "AddressSanitizer: while reporting a bug found another one.Ignoring." right before the stack trace.

Such messages happen when you hit two bugs from two different threads.

As you can see, the invalid free is coming from fontconfig.
The fontconfig code itself is not instrumented by asan and we may be missing 
some other bugs in the libraray. 
I'd suggest that we use our own private version of fontconfig in asan build, 
just as we do (or were going to do?) with freetype.
This way we can find more bugs there. 

Also note, that since fontconfig us not instrumented, asan can not unwind stack
through it.  
You can pass ASAN_OPTIONS=fast_unwind_on_malloc=1 to make see the full stacks. 



ASAN_OPTIONS=fast_unwind_on_malloc=0
Status: Assigned
@meacer: we know what milestones / versions this affects?
Comment 7 by meacer@chromium.org, Mar 26 2013
Labels: M-27 Security_Impact-None
M26 doesn't seem to be affected.
Comment 8 by meacer@chromium.org, Mar 29 2013
Labels: -M-27 -Security_Impact-None M-26 Security_Impact-Stable
Changing once more. This does affect M26 Stable (at least r180339).
I haven't been able to repro this, both on ToT and on r190004 specified in the clusterfuzz report.

Is there an ASAN flag required to catch the invalid free error? I can get ASAN to complain if I do a use-after-free in FontSettingsGetFontListFunction::RunImpl like:

  int* x = (int*) malloc(sizeof(int));
  *x = 5;
  free(x);
  LOG(ERROR) << "hi" << *x;

But it doesn't complain on something like

  int* x = (int*) malloc(sizeof(int));
  free(x);
  free(x);

or

  int* x;
  free(x);

Or maybe something in fontconfig is different on my system vs the cluster fuzz?
Comment 10 by kcc@chromium.org, Apr 1 2013
asan typically finds double-free and invalid-free.
Please check that you've written an optimizer-resistant test, e.g. 

volatile int *x = (int*)12345678;
free((void*)x);

That test dies with 

==24304== ERROR: AddressSanitizer: SEGV on unknown address 0x000000bc613e (pc 0x7f9ca8936eed sp 0x7fffb38333f0 bp 0x000000000001 T0)

which is a little different than the invalid free message.
Hm, seems like a race condition. I once got the error reported in this bug, but usually don't.
Here's my output:

=================================================================
==32326== ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x6008001913a0
==32326== AddressSanitizer: while reporting a bug found another one.Ignoring.
    #0 0x7fe843243d52 in free ??:0
    #1 0x7fe83f2065b7 in ?? ??:0
    #2 0x7fe83f20688e in ?? ??:0
    #3 0x7fe83f200e6b in ?? ??:0
    #4 0x7fe83b41008c in ?? ??:0
    #5 0x7fe848174ec8 in content::GetFontList_SlowBlocking() /work/chrome/src/out/Release/../../content/common/font_list_linux.cc:23:0
    #6 0x7fe845d78fc5 in content::(anonymous namespace)::GetFontListInBlockingPool(content::BrowserThread::ID, base::Callback<void (scoped_ptr<base::ListValue, base::DefaultDeleter<base::ListValue> >)> const&) /work/chrome/src/out/Release/../../content/browser/font_list_async.cc:26:0
    #7 0x7fe844ff6912 in base::Callback<void ()>::Run() const /work/chrome/src/out/Release/../../base/callback.h:396:0
    #8 0x7fe844ff6912 in base::SequencedWorkerPool::Inner::ThreadLoop(base::SequencedWorkerPool::Worker*) /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:730:0
    #9 0x7fe844ff48df in base::SequencedWorkerPool::Worker::Run() /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:487:0
    #10 0x7fe844fff81a in base::SimpleThread::ThreadMain() /work/chrome/src/out/Release/../../base/threading/simple_thread.cc:60:0
    #11 0x7fe844ff366c in base::(anonymous namespace)::ThreadFunc(void*) /work/chrome/src/out/Release/../../base/threading/platform_thread_posix.cc:100:0
    #12 0x7fe84324982a in __asan::AsanThread::ThreadStart() ??:0
    #13 0x7fe83dfcde99 in start_thread /build/buildd/eglibc-2.15/nptl/pthread_create.c:308
    #14 0x7fe83c0d6cbc in ?? /build/buildd/eglibc-2.15/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:112
0x6008001913a0 is located 16 bytes inside of 38-byte region [0x600800191390,0x6008001913b6)
allocated by thread T20 (BrowserBlocking) here:
    #0 0x7fe843243e32 in malloc ??:0
    #1 0x7fe83f207672 in ?? ??:0
    #2 0x7fe83f207757 in ?? ??:0
    #3 0x7fe83f207804 in ?? ??:0
    #4 0x7fe83f203644 in ?? ??:0
    #5 0x7fe83f2038bf in ?? ??:0
    #6 0x7fe83b40ff28 in ?? ??:0
    #7 0x7fe848174ec8 in content::GetFontList_SlowBlocking() /work/chrome/src/out/Release/../../content/common/font_list_linux.cc:23:0
    #8 0x7fe845d78fc5 in content::(anonymous namespace)::GetFontListInBlockingPool(content::BrowserThread::ID, base::Callback<void (scoped_ptr<base::ListValue, base::DefaultDeleter<base::ListValue> >)> const&) /work/chrome/src/out/Release/../../content/browser/font_list_async.cc:26:0
    #9 0x7fe844ff6912 in base::Callback<void ()>::Run() const /work/chrome/src/out/Release/../../base/callback.h:396:0
    #10 0x7fe844ff6912 in base::SequencedWorkerPool::Inner::ThreadLoop(base::SequencedWorkerPool::Worker*) /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:730:0
    #11 0x7fe844ff48df in base::SequencedWorkerPool::Worker::Run() /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:487:0
    #12 0x7fe844fff81a in base::SimpleThread::ThreadMain() /work/chrome/src/out/Release/../../base/threading/simple_thread.cc:60:0
    #13 0x7fe844ff366c in base::(anonymous namespace)::ThreadFunc(void*) /work/chrome/src/out/Release/../../base/threading/platform_thread_posix.cc:100:0
    #14 0x7fe84324982a in __asan::AsanThread::ThreadStart() ??:0
    #15 0x7fe83dfcde99 in start_thread /build/buildd/eglibc-2.15/nptl/pthread_create.c:308
    #16 0x7fe83c0d6cbc in ?? /build/buildd/eglibc-2.15/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:112
Thread T20 (BrowserBlocking) created by T0 (chrome) here:
    #0 0x7fe84323fbf4 in pthread_create ??:0
    #1 0x7fe844ff33c5 in base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, unsigned long*, base::ThreadPriority) /work/chrome/src/out/Release/../../base/threading/platform_thread_posix.cc:164:0
    #2 0x7fe844ff327c in base::PlatformThread::Create(unsigned long, base::PlatformThread::Delegate*, unsigned long*) /work/chrome/src/out/Release/../../base/threading/platform_thread_posix.cc:265:0
    #3 0x7fe844fff2bd in base::SimpleThread::Start() /work/chrome/src/out/Release/../../base/threading/simple_thread.cc:32:0
    #4 0x7fe844ff45a5 in base::SequencedWorkerPool::Worker::Worker(scoped_refptr<base::SequencedWorkerPool> const&, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:475:0
    #5 0x7fe844ffa361 in base::SequencedWorkerPool::Inner::FinishStartingAdditionalThread(int) /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:1073:0
    #6 0x7fe844ff9b04 in base::SequencedWorkerPool::Inner::PostTask(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const*, base::SequencedWorkerPool::SequenceToken, base::SequencedWorkerPool::WorkerShutdown, tracked_objects::Location const&, base::Callback<void ()> const&, base::TimeDelta) /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:600:0
    #7 0x7fe844ffe7de in base::SequencedWorkerPool::PostDelayedSequencedWorkerTask(base::SequencedWorkerPool::SequenceToken, tracked_objects::Location const&, base::Callback<void ()> const&, base::TimeDelta) /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:1190:0
    #8 0x7fe844ffe7de in base::(anonymous namespace)::SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask(tracked_objects::Location const&, base::Callback<void ()> const&, base::TimeDelta) /work/chrome/src/out/Release/../../base/threading/sequenced_worker_pool.cc:191:0
    #9 0x7fe844ff175a in base::TaskRunner::PostTask(tracked_objects::Location const&, base::Callback<void ()> const&) /work/chrome/src/out/Release/../../base/task_runner.cc:45:0
    #10 0x7fe843b3f2d3 in (anonymous namespace)::CreateProfileDirectory(base::SequencedTaskRunner*, base::FilePath const&) /work/chrome/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:184:0
    #11 0x7fe843b42575 in ProfileImpl::DoFinalInit(bool) /work/chrome/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:457:0
    #12 0x7fe843b41c22 in ProfileImpl::OnPrefsLoaded(bool) /work/chrome/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:752:0
    #13 0x7fe843b40ad9 in ProfileImpl::ProfileImpl(base::FilePath const&, Profile::Delegate*, Profile::CreateMode, base::SequencedTaskRunner*) /work/chrome/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:425:0
    #14 0x7fe843b3f06e in Profile::CreateProfile(base::FilePath const&, Profile::Delegate*, Profile::CreateMode) /work/chrome/src/out/Release/../../chrome/browser/profiles/profile_impl.cc:266:0
    #15 0x7fe8435d79ea in ProfileManager::GetProfile(base::FilePath const&) /work/chrome/src/out/Release/../../chrome/browser/profiles/profile_manager.cc:428:0
    #16 0x7fe843d97d0e in ChromeBrowserMainParts::parsed_command_line() const /work/chrome/src/out/Release/../../chrome/browser/chrome_browser_main.cc:383:0
    #17 0x7fe843d97d0e in ChromeBrowserMainParts::PreMainMessageLoopRunImpl() /work/chrome/src/out/Release/../../chrome/browser/chrome_browser_main.cc:1274:0
    #18 0x7fe843d958a5 in ChromeBrowserMainParts::PreMainMessageLoopRun() /work/chrome/src/out/Release/../../chrome/browser/chrome_browser_main.cc:1026:0
    #19 0x7fe845cd1e8c in content::BrowserMainLoop::CreateThreads() /work/chrome/src/out/Release/../../content/browser/browser_main_loop.cc:504:0
    #20 0x7fe84600b659 in content::BrowserMainRunnerImpl::Initialize(content::MainFunctionParams const&) /work/chrome/src/out/Release/../../content/browser/browser_main_runner.cc:111:0
    #21 0x7fe84bf09332 in content::BrowserMain(content::MainFunctionParams const&) /work/chrome/src/out/Release/../../content/browser/browser_main.cc:18:0
    #22 0x7fe848f82a9d in content::RunNamedProcessTypeMain(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, content::MainFunctionParams const&, content::ContentMainDelegate*) /work/chrome/src/out/Release/../../content/app/content_main_runner.cc:455:0
    #23 0x7fe848f840e9 in content::ContentMainRunnerImpl::Run() /work/chrome/src/out/Release/../../content/app/content_main_runner.cc:760:0
    #24 0x7fe848f80dc1 in content::ContentMain(int, char const**, content::ContentMainDelegate*) /work/chrome/src/out/Release/../../content/app/content_main.cc:35:0
    #25 0x7fe84324fcea in ChromeMain /work/chrome/src/out/Release/../../chrome/app/chrome_main.cc:32:0
    #26 0x7fe84324fc3a in main /work/chrome/src/out/Release/../../chrome/app/chrome_exe_main_gtk.cc:34:0
    #27 0x7fe83c00476c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
==32326== ABORTING

The invalid free and allocation line are the same: content::GetFontList_SlowBlocking() in font_list_linux.cc:23:

  ::pango_font_map_list_families(font_map, &families, &num_families);

I guess we either have a bad race condition in Chromium's get font list code or the error is in Pango/Fontconfig.


Cc: behdad@chromium.org
I think I see the problem. Pango is not threadsafe and we're calling pango_font_map_list_families on multiple threads via GetFontListAsync.

It looks like newer versions of Pango may be threadsafe:
https://mail.gnome.org/archives/commits-list/2013-January/msg00349.html

Maybe in the meantime we must change GetFontList_SlowBlocking to be threadsafe.
Cc: brettw@chromium.org
Status: Started
https://codereview.chromium.org/13458002/
Yes, new Pango+Fontconfig+Cairo is threadsafe.
Cc: raymes@chromium.org
+raymes: context for https://codereview.chromium.org/13458002/
Status: Fixed
Labels: -Restrict-View-SecurityTeam Restrict-View-SecurityNotify Merge-Approved
Labels: -M-26 -Merge-Approved M-28 Release-0
Since this is Medium severity, I'm OK with skipping a merge and letting it roll into M28.
Labels: -Restrict-View-SecurityNotify
Bulk release of old security bug reports.

Project Member Comment 23 by sheriffbot@chromium.org, Oct 1 2016
This bug has been closed for more than 14 weeks. Removing security view restrictions.

For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
Project Member Comment 24 by sheriffbot@chromium.org, Oct 2 2016
This bug has been closed for more than 14 weeks. Removing security view restrictions.

For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
Labels: allpublic
Sign in to add a comment