+2010-03-01 Miguel de Icaza <miguel@novell.com>
+
+ * Win32Resources.cs: Prevent infinite loops if the resource that
+ we are reading is invalid. Fixes the mscorlib part of #327500
+
2009-11-01 Sebastien Pouliot <sebastien@ximian.com>
* ResourceManager.cs (GetResourceFilePath): Don't use
return w1 | (w2 << 16);
}
- private void read_padding () {
- while ((res_file.Position % 4) != 0)
- read_int16 ();
+ private bool read_padding () {
+ while ((res_file.Position % 4) != 0){
+ if (read_int16 () == -1)
+ return false;
+ }
+ return true;
}
NameOrId read_ordinal () {
while (true) {
- read_padding ();
-
+ if (!read_padding ())
+ break;
+
int data_size = read_int32 ();
if (data_size == -1)
NameOrId type = read_ordinal ();
NameOrId name = read_ordinal ();
- read_padding ();
-
+ if (!read_padding ())
+ break;
+
//int data_version =
read_int32 ();
//int memory_flags =
continue;
byte[] data = new byte [data_size];
- res_file.Read (data, 0, data_size);
+ if (res_file.Read (data, 0, data_size) != data_size)
+ break;
resources.Add (new Win32EncodedResource (type, name, language_id, data));
}