From de5fae0d84a967f48412cd0a701f3e432978fe34 Mon Sep 17 00:00:00 2001
From: Jie Luo <jieluo@google.com>
Date: Fri, 6 Jan 2023 04:59:58 -0800
Subject: [PATCH] Automated rollback of commit
 c105e85e7c46934bf0513d64901624669da42d30.

PiperOrigin-RevId: 500150564
---
 conformance/binary_json_conformance_suite.cc     |  4 ----
 conformance/failure_list_ruby.txt                |  2 --
 .../com/google/protobuf/util/JsonFormat.java     | 16 ++++------------
 src/google/protobuf/json/internal/unparser.cc    | 12 ------------
 4 files changed, 4 insertions(+), 30 deletions(-)

diff --git a/conformance/binary_json_conformance_suite.cc b/conformance/binary_json_conformance_suite.cc
index a915c29263..239db3b7af 100644
--- a/conformance/binary_json_conformance_suite.cc
+++ b/conformance/binary_json_conformance_suite.cc
@@ -3334,10 +3334,6 @@ void BinaryAndJsonConformanceSuite::RunJsonTestsForValue() {
         return value.empty();
       },
       true);
-  ExpectSerializeFailureForJson("ValueRejectNanNumberValue", RECOMMENDED,
-                                "optional_value: { number_value: nan}");
-  ExpectSerializeFailureForJson("ValueRejectInfNumberValue", RECOMMENDED,
-                                "optional_value: { number_value: inf}");
 }
 
 void BinaryAndJsonConformanceSuite::RunJsonTestsForAny() {
diff --git a/conformance/failure_list_ruby.txt b/conformance/failure_list_ruby.txt
index 8eb63b9a7d..3c744391cf 100644
--- a/conformance/failure_list_ruby.txt
+++ b/conformance/failure_list_ruby.txt
@@ -58,5 +58,3 @@ Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.UnpackedOu
 Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.UnpackedOutput.ProtobufOutput
 Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.UnpackedOutput.ProtobufOutput
 Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.ValueRejectInfNumberValue.JsonOutput
-Recommended.ValueRejectNanNumberValue.JsonOutput
diff --git a/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java b/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java
index 96bc38898f..992980b0dc 100644
--- a/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java
+++ b/java/util/src/main/java/com/google/protobuf/util/JsonFormat.java
@@ -51,6 +51,7 @@ import com.google.protobuf.Descriptors.Descriptor;
 import com.google.protobuf.Descriptors.EnumDescriptor;
 import com.google.protobuf.Descriptors.EnumValueDescriptor;
 import com.google.protobuf.Descriptors.FieldDescriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor.Type;
 import com.google.protobuf.Descriptors.FileDescriptor;
 import com.google.protobuf.Descriptors.OneofDescriptor;
 import com.google.protobuf.DoubleValue;
@@ -965,16 +966,7 @@ public class JsonFormat {
         throw new InvalidProtocolBufferException("Invalid Value type.");
       }
       for (Map.Entry<FieldDescriptor, Object> entry : fields.entrySet()) {
-        FieldDescriptor field = entry.getKey();
-        if (field.getType() == FieldDescriptor.Type.DOUBLE) {
-          Double doubleValue = (Double) entry.getValue();
-          if (doubleValue.isNaN() || doubleValue.isInfinite()) {
-            throw new IllegalArgumentException(
-                "google.protobuf.Value cannot encode double values for "
-                + "infinity or nan, because they would be parsed as a string.");
-          }
-        }
-        printSingleFieldValue(field, entry.getValue());
+        printSingleFieldValue(entry.getKey(), entry.getValue());
       }
     }
 
@@ -1691,7 +1683,7 @@ public class JsonFormat {
         Object key = parseFieldValue(keyField, new JsonPrimitive(entry.getKey()), entryBuilder);
         Object value = parseFieldValue(valueField, entry.getValue(), entryBuilder);
         if (value == null) {
-          if (ignoringUnknownFields && valueField.getType() == FieldDescriptor.Type.ENUM) {
+          if (ignoringUnknownFields && valueField.getType() == Type.ENUM) {
             continue;
           } else {
             throw new InvalidProtocolBufferException("Map value cannot be null.");
@@ -1732,7 +1724,7 @@ public class JsonFormat {
       for (int i = 0; i < array.size(); ++i) {
         Object value = parseFieldValue(field, array.get(i), builder);
         if (value == null) {
-          if (ignoringUnknownFields && field.getType() == FieldDescriptor.Type.ENUM) {
+          if (ignoringUnknownFields && field.getType() == Type.ENUM) {
             continue;
           } else {
             throw new InvalidProtocolBufferException(
diff --git a/src/google/protobuf/json/internal/unparser.cc b/src/google/protobuf/json/internal/unparser.cc
index 0e26ff1db4..5bda3dbf03 100644
--- a/src/google/protobuf/json/internal/unparser.cc
+++ b/src/google/protobuf/json/internal/unparser.cc
@@ -34,7 +34,6 @@
 #include <complex>
 #include <cstdint>
 #include <cstring>
-#include <limits>
 #include <memory>
 #include <sstream>
 #include <string>
@@ -490,17 +489,6 @@ absl::Status WriteValue(JsonWriter& writer, const Msg<Traits>& msg,
   if (Traits::GetSize(number_field, msg) > 0) {
     auto x = Traits::GetDouble(number_field, msg);
     RETURN_IF_ERROR(x.status());
-    if (std::isnan(*x)) {
-      return absl::InvalidArgumentError(
-          "google.protobuf.Value cannot encode double values for nan, "
-          "because it would be parsed as a string");
-    }
-    if (*x == std::numeric_limits<double>::infinity() |
-        *x == -std::numeric_limits<double>::infinity()) {
-      return absl::InvalidArgumentError(
-          "google.protobuf.Value cannot encode double values for "
-          "infinity, because it would be parsed as a string");
-    }
     writer.Write(*x);
     return absl::OkStatus();
   }