Bläddra i källkod

Throw a better exception when invalid base64 is detected in JSON

Jon Skeet 9 år sedan
förälder
incheckning
1a34ac03be

+ 9 - 0
csharp/src/Google.Protobuf.Test/JsonParserTest.cs

@@ -821,6 +821,15 @@ namespace Google.Protobuf
             Assert.Throws<InvalidProtocolBufferException>(() => parser63.Parse<TestRecursiveMessage>(data64));
             Assert.Throws<InvalidProtocolBufferException>(() => parser63.Parse<TestRecursiveMessage>(data64));
         }
         }
 
 
+        [Test]
+        [TestCase("AQI")]
+        [TestCase("_-==")]
+        public void Bytes_InvalidBase64(string badBase64)
+        {
+            string json = "{ \"singleBytes\": \"" + badBase64 + "\" }";
+            Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
+        }
+
         [Test]
         [Test]
         [TestCase("\"FOREIGN_BAR\"")]
         [TestCase("\"FOREIGN_BAR\"")]
         [TestCase("5")]
         [TestCase("5")]

+ 11 - 0
csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs

@@ -30,6 +30,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #endregion
 #endregion
 
 
+using System;
 using System.IO;
 using System.IO;
 
 
 namespace Google.Protobuf
 namespace Google.Protobuf
@@ -45,6 +46,11 @@ namespace Google.Protobuf
         {
         {
         }
         }
 
 
+        internal InvalidProtocolBufferException(string message, Exception innerException)
+            : base(message, innerException)
+        {
+        }
+
         internal static InvalidProtocolBufferException MoreDataAvailable()
         internal static InvalidProtocolBufferException MoreDataAvailable()
         {
         {
             return new InvalidProtocolBufferException(
             return new InvalidProtocolBufferException(
@@ -82,6 +88,11 @@ namespace Google.Protobuf
                 "Protocol message contained an invalid tag (zero).");
                 "Protocol message contained an invalid tag (zero).");
         }
         }
 
 
+        internal static InvalidProtocolBufferException InvalidBase64(Exception innerException)
+        {
+            return new InvalidProtocolBufferException("Invalid base64 data", innerException);
+        }
+
         internal static InvalidProtocolBufferException InvalidEndTag()
         internal static InvalidProtocolBufferException InvalidEndTag()
         {
         {
             return new InvalidProtocolBufferException(
             return new InvalidProtocolBufferException(

+ 8 - 1
csharp/src/Google.Protobuf/JsonParser.cs

@@ -647,7 +647,14 @@ namespace Google.Protobuf
                 case FieldType.String:
                 case FieldType.String:
                     return text;
                     return text;
                 case FieldType.Bytes:
                 case FieldType.Bytes:
-                    return ByteString.FromBase64(text);
+                    try
+                    {
+                        return ByteString.FromBase64(text);
+                    }
+                    catch (FormatException e)
+                    {
+                        throw InvalidProtocolBufferException.InvalidBase64(e);
+                    }
                 case FieldType.Int32:
                 case FieldType.Int32:
                 case FieldType.SInt32:
                 case FieldType.SInt32:
                 case FieldType.SFixed32:
                 case FieldType.SFixed32: