[BUG] Validation of message with `com.google.protobuf.Timestamp` fails with `java.time.DateTimeException` if seconds/nanos exceed `Instant` bounds
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Anfängerfreundlichkeit
- 45/100
Rechercherichtung
Beginnen Sie in src/main/java/build/buf/protovalidate/ProtoAdapter.java bei der scalarToCel-Konvertierung in den Zeilen 93–104 und reproduzieren Sie anschließend die Validierung mit einem Timestamp-Sekundenwert von Long.MAX_VALUE. Prüfen Sie sowohl extreme Timestamp- als auch Duration-Werte und betrachten Sie die Arbeit als abgeschlossen, wenn die Validierung einen eindeutigen Validierungsfehler zurückgibt, anstatt eine Datums- oder Arithmetikausnahme weiterzugeben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Description
Validation of com.google.protobuf.Timestamp fails with java.time.DateTimeException when the timestamp's seconds or nanoseconds values exceed the bounds that can be represented by Java's Instant class. This occurs when attempting to validate protobuf messages containing timestamps with extreme values like Long.MAX_VALUE for seconds, which cannot be converted to a valid Instant object.
The underlying issue is in ProtoAdapter class:
Similar issue seems to also affect com.google.protobuf.Duration if using extreme nanos values due to the ProtoAdapter implementation linked above.
Steps to Reproduce
- Define a protobuf message with a
google.protobuf.Timestampfield:
syntax = "proto3";
package acme.foo.v1;
import "buf/validate/validate.proto";
message Foo {
google.protobuf.Timestamp bar = 1;
}
- Create a protobuf message instance with timestamp seconds set to
Long.MAX_VALUE:
Foo message = Foo.newBuilder()
.setBar(Timestamp.newBuilder().setSeconds(Long.MAX_VALUE))
.build();
- Attempt to validate the message using protovalidate:
ValidationResult result = validator.validate(message); - Observe the
java.time.DateTimeExceptionbeing thrown during validation
Expected Behavior
The validation should provide a clear validation error indicating the timestamp is out of bounds instead of throwing uncaught java.time.DateTimeException
Actual Behavior
A java.time.DateTimeException is thrown when the validator attempts to convert the protobuf timestamp to a Java Instant object, causing the entire validation process to fail with an unhandled exception rather than a proper validation error.
Screenshots/Logs
java.time.DateTimeException: Instant exceeds minimum or maximum instant
at java.base/java.time.Instant.create(Instant.java:414)
at java.base/java.time.Instant.ofEpochSecond(Instant.java:334)
at build.buf.protovalidate.ProtoAdapter.scalarToCel(ProtoAdapter.java:98)
at build.buf.protovalidate.ProtoAdapter.toCel(ProtoAdapter.java:65)
at build.buf.protovalidate.ObjectValue.value(ObjectValue.java:65)
at build.buf.protovalidate.ValueEvaluator.evaluate(ValueEvaluator.java:74)
at build.buf.protovalidate.FieldEvaluator.evaluate(FieldEvaluator.java:121)
at build.buf.protovalidate.MessageEvaluator.evaluate(MessageEvaluator.java:41)
Environment
- Protovalidate Version: v1.0.1
Possible Solution
The protovalidate ProtoAdapter class or some other part of logic before it should:
- Add bounds checking before attempting to convert protobuf timestamps to Java
Instantobjects or protobuf durations to JavaDurationobjects. - Or catch
DateTimeException(timestamp to Instant case) /ArithmeticException(duration case) during protobuf to Java instance conversion and convert it to a proper validation error
- Vorherrschende Sprache
- Java
- Sterne
- 70
- Forks
- 17
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 13
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus bufbuild/protovalidate-java
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 25/100
bufbuild/protovalidate-java#362 · 1 Kommentar ·
-
Feature
bufbuild/protovalidate-java#80 · 1 zugewiesene Person ·
Alle Issues in bufbuild/protovalidate-java
Ähnliche Issues
-
executions.Query — startDate and timeRange filters are sent with inverted comparison operators Offenarea/plugin
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
kestra-io/plugin-kestra#190 ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
integra-team-red/meet-map#249 ·
-
[Studio][Bug] Cancelled create-user dialog keeps the password and admin switch for the next attempt Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
apache/rocketmq-dashboard#5064 ·