2005-06-05 Peter Bartok <pbartok@novell.com>
[mono.git] / mcs / class / corlib / System.Security.Cryptography / CryptoStream.cs
old mode 100755 (executable)
new mode 100644 (file)
index 3aa2ae3..986279d
@@ -9,6 +9,29 @@
 // (C) 2004 Novell (http://www.novell.com)
 //
 
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System;
 using System.Globalization;
 using System.IO;
@@ -118,7 +141,8 @@ namespace System.Security.Cryptography {
                        }
                        // yes - buffer.Length will throw a NullReferenceException if buffer is null
                        // but by doing so we match MS implementation
-                       if (offset + count > buffer.Length) {
+                       // re-ordered to avoid integer overflow
+                       if (offset > buffer.Length - count) {
                                throw new ArgumentException ("(offset+count)", 
                                        Locale.GetText ("buffer overflow"));
                        }
@@ -224,7 +248,8 @@ namespace System.Security.Cryptography {
                                throw new ArgumentOutOfRangeException ("count", 
                                        Locale.GetText ("negative"));
                        }
-                       if (offset + count > buffer.Length) {
+                       // re-ordered to avoid integer overflow
+                       if (offset > buffer.Length - count) {
                                throw new ArgumentException ("(offset+count)", 
                                        Locale.GetText ("buffer overflow"));
                        }
@@ -253,8 +278,6 @@ namespace System.Security.Cryptography {
                                        // transform all except the last block (which may be the last block
                                        // of the stream and require TransformFinalBlock)
                                        int numBlock = ((_partialCount + count) / _transform.InputBlockSize);
-                                       if (((_partialCount + count) % _transform.InputBlockSize) == 0) // partial block ?
-                                               numBlock--; // no then reduce
                                        int multiSize = (numBlock * _transform.InputBlockSize);
                                        if (numBlock > 0) {
                                                byte[] multiBlocks = new byte [multiSize];