fix skslc crashes uncovered by fuzz testing
authorethannicholas <ethannicholas@google.com>
Fri, 14 Oct 2016 15:37:32 +0000 (08:37 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 14 Oct 2016 15:37:32 +0000 (08:37 -0700)
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2413423003

Review-Url: https://codereview.chromium.org/2413423003

src/sksl/SkSLIRGenerator.cpp
src/sksl/SkSLParser.cpp

index 6307087..9a42379 100644 (file)
@@ -1228,6 +1228,7 @@ std::unique_ptr<Expression> IRGenerator::convertSuffixExpression(
                                                                      *newType));
             } else {
                 fErrors.error(expression.fPosition, "'[]' must follow a type name");
+                return nullptr;
             }
         }
         case ASTSuffix::kCall_Kind: {
index 9e3e847..d011d46 100644 (file)
@@ -808,17 +808,26 @@ std::unique_ptr<ASTForStatement> Parser::forStatement() {
         case Token::SEMICOLON: 
             this->nextToken();
             break;
-        case Token::CONST:
+        case Token::CONST: {
+            std::unique_ptr<ASTVarDeclarations> vd = this->varDeclarations();
+            if (!vd) {
+                return nullptr;
+            }
             initializer = std::unique_ptr<ASTStatement>(new ASTVarDeclarationStatement(
-                                                                          this->varDeclarations()));
+                                                                                    std::move(vd)));
             break;
-        case Token::IDENTIFIER: 
+        }
+        case Token::IDENTIFIER: {
             if (this->isType(nextToken.fText)) {
+                std::unique_ptr<ASTVarDeclarations> vd = this->varDeclarations();
+                if (!vd) {
+                    return nullptr;
+                }
                 initializer = std::unique_ptr<ASTStatement>(new ASTVarDeclarationStatement(
-                                                                          this->varDeclarations()));
+                                                                                    std::move(vd)));
                 break;
             }
-            // fall through
+        } // fall through
         default:
             initializer = this->expressionStatement();
     }