Fix crash in DoDescheduleUntilFinishedCHROMIUM()

gl::GLFence::Create() can return nullptr, in this case
the DoDescheduleUntilFinishedCHROMIUM() will crash. Fix the problem
by marking context lost if gl::GLFence::Create() returns nullptr.

Bug: 1221094
Change-Id: I87bd654e4486330c9dc15fb7d8e668acfb29d779
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2971647
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Peng Huang <penghuang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#896571}
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
index 90e5de37..e7a3f1f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -4728,7 +4728,16 @@
   if (!gl::GLFence::IsSupported()) {
     return error::kNoError;
   }
-  deschedule_until_finished_fences_.push_back(gl::GLFence::Create());
+
+  auto fence = gl::GLFence::Create();
+  if (!fence) {
+    InsertError(GL_INVALID_OPERATION, "gl::GLFence::Create() failed.");
+    MarkContextLost(error::kUnknown);
+    group_->LoseContexts(error::kUnknown);
+    return error::kLostContext;
+  }
+
+  deschedule_until_finished_fences_.push_back(std::move(fence));
 
   if (deschedule_until_finished_fences_.size() == 1) {
     return error::kNoError;