Skip to content

Merging internal commits for release/7.0 #83405

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

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
08db90f
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
ee33e0d
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
73c57f5
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
620abaa
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
8e27d40
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
7b279b9
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
7b0cc93
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
b8ee66c
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
faed9f8
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
ce89907
Merge in 'release/7.0' changes
dotnet-bot Feb 8, 2023
705d992
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
2ffbebe
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
e1bf2f6
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
1444583
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
faf36d2
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
037e4c0
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
e2ed7b1
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
ba013bd
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
cdd0443
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
3f7b32f
Merge in 'release/7.0' changes
dotnet-bot Feb 9, 2023
beeb6fc
Merge in 'release/7.0' changes
dotnet-bot Feb 10, 2023
55768a2
Fix TimeZone when reading invalid TZ files
tarekgh Feb 10, 2023
9f9cb22
Merge in 'release/7.0' changes
dotnet-bot Feb 11, 2023
f3c7837
Merge in 'release/7.0' changes
dotnet-bot Feb 13, 2023
dcb489a
Merge in 'release/7.0' changes
dotnet-bot Feb 14, 2023
cc8752f
Merge in 'release/7.0' changes
dotnet-bot Feb 15, 2023
0a396ac
Merge in 'release/7.0' changes
dotnet-bot Feb 16, 2023
b77565a
Merge commit '0a396acafe9a7d46bce11f4338dbb3dd0d99b1b4' into internal…
vseanreesermsft Mar 14, 2023
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
Original file line number Diff line number Diff line change
Expand Up @@ -2603,6 +2603,9 @@
<data name="InvalidProgram_Default" xml:space="preserve">
<value>Common Language Runtime detected an invalid program.</value>
</data>
<data name="InvalidTimeZone_InvalidId" xml:space="preserve">
<value>The time zone ID '{0}' is invalid.</value>
</data>
<data name="InvalidTimeZone_InvalidFileData" xml:space="preserve">
<value>The time zone ID '{0}' was found on the local computer, but the file at '{1}' was corrupt.</value>
</data>
Expand All @@ -2627,6 +2630,9 @@
<data name="IO_NoFileTableInInMemoryAssemblies" xml:space="preserve">
<value>This assembly does not have a file table because it was loaded from memory.</value>
</data>
<data name="IO_UnseekableFile" xml:space="preserve">
<value>Unsupported unseekable file.</value>
</data>
<data name="IO_EOF_ReadBeyondEOF" xml:space="preserve">
<value>Unable to read beyond the end of the stream.</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,61 @@ private static TimeZoneInfo GetLocalTimeZoneCore()
return GetLocalTimeZoneFromTzFile();
}

private static byte[] ReadAllBytesFromSeekableNonZeroSizeFile(string path, int maxFileSize)
{
using FileStream fs = File.OpenRead(path);
if (!fs.CanSeek)
{
throw new IOException(SR.IO_UnseekableFile);
}

if (fs.Length == 0 || fs.Length > maxFileSize)
{
throw new IOException(fs.Length == 0 ? SR.IO_InvalidReadLength : SR.IO_FileTooLong);
}

byte[] bytes = new byte[fs.Length];
fs.ReadExactly(bytes, 0, bytes.Length);
return bytes;
}

// Bitmap covering the ASCII range. The bits is set for the characters [a-z], [A-Z], [0-9], '/', '-', and '_'.
private static byte[] asciiBitmap = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x87, 0xFE, 0xFF, 0xFF, 0x07 };
private static bool IdContainsAnyDisallowedChars(string zoneId)
{
for (int i = 0; i < zoneId.Length; i++)
{
int c = zoneId[i];
if (c > 0x7F)
{
return true;
}
int value = c >> 3;
if ((asciiBitmap[value] & (ulong)(1UL << (c - (value << 3)))) == 0)
{
return true;
}
}
return false;
}

private static TimeZoneInfoResult TryGetTimeZoneFromLocalMachineCore(string id, out TimeZoneInfo? value, out Exception? e)
{
value = null;
e = null;

if (Path.IsPathRooted(id) || IdContainsAnyDisallowedChars(id))
{
e = new TimeZoneNotFoundException(SR.Format(SR.InvalidTimeZone_InvalidId, id));
return TimeZoneInfoResult.TimeZoneNotFoundException;
}

string timeZoneDirectory = GetTimeZoneDirectory();
string timeZoneFilePath = Path.Combine(timeZoneDirectory, id);
byte[] rawData;
try
{
rawData = File.ReadAllBytes(timeZoneFilePath);
rawData = ReadAllBytesFromSeekableNonZeroSizeFile(timeZoneFilePath, maxFileSize: 20 * 1024 * 1024 /* 20 MB */); // timezone files usually less than 1 MB.
}
catch (UnauthorizedAccessException ex)
{
Expand All @@ -51,7 +95,7 @@ private static TimeZoneInfoResult TryGetTimeZoneFromLocalMachineCore(string id,
e = ex;
return TimeZoneInfoResult.TimeZoneNotFoundException;
}
catch (IOException ex)
catch (Exception ex) when (ex is IOException || ex is OutOfMemoryException)
{
e = new InvalidTimeZoneException(SR.Format(SR.InvalidTimeZone_InvalidFileData, id, timeZoneFilePath), ex);
return TimeZoneInfoResult.InvalidTimeZoneException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2083,6 +2083,11 @@ public static IEnumerable<object[]> ConvertTime_DateTimeOffset_InvalidDestinatio
yield return new object[] { s_strPacific + "\\Display" };
yield return new object[] { s_strPacific + "\n" }; // no trailing newline
yield return new object[] { new string('a', 100) }; // long string
yield return new object[] { "/dev/random" };
yield return new object[] { "Invalid Id" };
yield return new object[] { "Invalid/Invalid" };
yield return new object[] { $"./{s_strPacific}" };
yield return new object[] { $"{s_strPacific}/../{s_strPacific}" };
}

[Theory]
Expand Down