-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Description
Description
Since System.Formats.Cbor adheres to RFC 7049, I don't believe NaN is handled correctly.
The RFC states for canonical CBOR:
Also, there are many representations for NaN. If NaN is an allowed value, it must always be represented as 0xf97e00.
CborWriter will encode it as 0xF9FE00.
Similarly, CborReader will not throw for any non-canonically encoded NaN.
Reproduction Steps
To reproduce the CborWriter issue:
using System;
using System.Formats.Cbor;
CborWriter writer = new(CborConformanceMode.Canonical);
writer.WriteSingle(float.NaN);
Console.WriteLine(Convert.ToHexString(writer.Encode())); // Outputs F9FE00To reproduce the CborReader issue:
byte[] canonical = Convert.FromHexString("F97E00");
byte[] nonCanonical = Convert.FromHexString("F9FE00");
CborReader canonicalReader = new CborReader(canonical, CborConformanceMode.Canonical);
CborReader nonCanonicalReader = new CborReader(nonCanonical, CborConformanceMode.Canonical);
Console.WriteLine(float.IsNaN(canonicalReader.ReadSingle()));
Console.WriteLine(float.IsNaN(nonCanonicalReader.ReadSingle()));Expected behavior
CborWriter encodes NaN as 0xf97e00.
CborReader should throw when decoding a NaN that is non-canonically encoded.
Actual behavior
CborWriter incorrectly encodes NaN as 0xF9FE00 when in canonical encoding.
CborReader incorrectly permits all encodings of NaN when in canonical encoding.
Regression?
No.
Known Workarounds
No response
Configuration
Host:
Version: 8.0.0-rc.1.23419.4
Architecture: arm64
Commit: 9295993
RID: osx-arm64
Using 7.0.0 of System.Formats.Cbor package.
Other information
No response