Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix CA2022 warnings (Avoid inexact read with 'Stream.Read') #100352

Merged
merged 7 commits into from
Mar 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions eng/CodeAnalysis.src.globalconfig
Original file line number Diff line number Diff line change
@@ -561,6 +561,9 @@ dotnet_diagnostic.CA2020.severity = warning
# CA2021: Do not call Enumerable.Cast<T> or Enumerable.OfType<T> with incompatible types
dotnet_diagnostic.CA2021.severity = warning

# CA2022: Avoid inexact read with 'Stream.Read'
dotnet_diagnostic.CA2022.severity = warning

# CA2100: Review SQL queries for security vulnerabilities
dotnet_diagnostic.CA2100.severity = none

3 changes: 3 additions & 0 deletions eng/CodeAnalysis.test.globalconfig
Original file line number Diff line number Diff line change
@@ -558,6 +558,9 @@ dotnet_diagnostic.CA2020.severity = none
# CA2021: Do not call Enumerable.Cast<T> or Enumerable.OfType<T> with incompatible types
dotnet_diagnostic.CA2021.severity = none

# CA2022: Avoid inexact read with 'Stream.Read'
dotnet_diagnostic.CA2022.severity = none

# CA2100: Review SQL queries for security vulnerabilities
dotnet_diagnostic.CA2100.severity = none

16 changes: 15 additions & 1 deletion src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs
Original file line number Diff line number Diff line change
@@ -963,7 +963,21 @@ public string ReadExisting()
Buffer.BlockCopy(_inBuffer, _readPos, bytesReceived, 0, CachedBytesToRead);
}

_internalSerialStream.Read(bytesReceived, CachedBytesToRead, bytesReceived.Length - (CachedBytesToRead)); // get everything
#if NET7_0_OR_GREATER
_internalSerialStream.ReadExactly(bytesReceived, CachedBytesToRead, bytesReceived.Length - CachedBytesToRead); // get everything
#else
int readCount = bytesReceived.Length - CachedBytesToRead;
int totalRead = 0;
while (totalRead < readCount)
{
int bytesRead = _internalSerialStream.Read(bytesReceived, CachedBytesToRead + totalRead, readCount - totalRead);
if (bytesRead <= 0)
{
throw new EndOfStreamException();
}
totalRead += bytesRead;
}
#endif

// Read full characters and leave partial input in the buffer. Encoding.GetCharCount doesn't work because
// it returns fallback characters on partial input, meaning that it overcounts. Instead, we use
Original file line number Diff line number Diff line change
@@ -86,7 +86,21 @@ public void Close()
_bufferState = BufferState.Reading;
_buffer = new byte[_stream.Length];
_stream.Position = 0;
_stream.Read(_buffer, 0, _buffer.Length);

#if NET7_0_OR_GREATER
_stream.ReadExactly(_buffer);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here

#else
int totalRead = 0;
while (totalRead < _buffer.Length)
{
int bytesRead = _stream.Read(_buffer, totalRead, _buffer.Length - totalRead);
if (bytesRead <= 0)
{
throw new EndOfStreamException();
}
totalRead += bytesRead;
}
#endif

_writer = null;
_stream = null;
17 changes: 16 additions & 1 deletion src/libraries/System.Speech/src/Internal/Synthesis/AudioBase.cs
Original file line number Diff line number Diff line change
@@ -121,7 +121,22 @@ internal void PlayWaveFile(AudioData audio)
try
{
byte[] data = new byte[(int)audio._stream.Length];
audio._stream.Read(data, 0, data.Length);

#if NET7_0_OR_GREATER
audio._stream.ReadExactly(data);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And here

#else
int totalRead = 0;
while (totalRead < data.Length)
{
int bytesRead = audio._stream.Read(data, totalRead, data.Length - totalRead);
if (bytesRead <= 0)
{
throw new EndOfStreamException();
}
totalRead += bytesRead;
}
#endif

Play(data);
}
finally
17 changes: 16 additions & 1 deletion src/libraries/System.Speech/src/Internal/Synthesis/EngineSite.cs
Original file line number Diff line number Diff line change
@@ -174,7 +174,22 @@ public Stream LoadResource(Uri uri, string mediaType)
int cLen = (int)stream.Length;
MemoryStream memStream = new(cLen);
byte[] ab = new byte[cLen];
stream.Read(ab, 0, ab.Length);

#if NET7_0_OR_GREATER
stream.ReadExactly(ab);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Basically all of them :)

#else
int totalRead = 0;
while (totalRead < cLen)
{
int bytesRead = stream.Read(ab, totalRead, cLen - totalRead);
if (bytesRead <= 0)
{
throw new EndOfStreamException();
}
totalRead += bytesRead;
}
#endif

_resourceLoader.UnloadFile(localPath);
memStream.Write(ab, 0, cLen);
memStream.Position = 0;