Walden Leverich - 2009-06-04

It's possible in 1.3.3 for ReadLines() to return an incomplete line, or more likely, an empty array of lines. This would result in an ArgumentOutOfRangeException at line 717 of FTPConnection. The code below fixes it (one of many ways to do it I'm sure). Also makes tmpMes a StringBuilder instead of string, but that's not needed for the fix.

        private ArrayList ReadLines(NetworkStream stream)
        {
            ArrayList messageList = new ArrayList();
            char[] seperator = { '\n' };
            char[] toRemove = { '\r' };
            Byte[] buffer = new Byte[BLOCK_SIZE];
            int bytes = 0;
            StringBuilder tmpMes = new StringBuilder(50);

            bool retry = true;
            int retryCount = 0;
            while (retry)
            {
                while (stream.DataAvailable)
                {
                    bytes = stream.Read(buffer, 0, buffer.Length);
                    tmpMes.Append(Encoding.ASCII.GetString(buffer, 0, bytes));
                }
                if (bytes == 0 || buffer[bytes - 1] != '\n')
                {
                    retryCount++;
                    if (retryCount > 800) // 800 = 40 seconds (800*50 = 40000)
                        throw new TimeoutException("Timeout waiting for data from remote server");

                    System.Threading.Thread.Sleep(50); // Wait for more data
                }
                else// ok, we've ended on a new line
                    retry = false;
            }

            string[] mess = tmpMes.ToString().Split(seperator);
            for (int i = 0; i < mess.Length; i++)
            {
                if (mess[i].Length > 0)
                {
                    messageList.Add(mess[i].Trim(toRemove));
                }
            }

            return messageList;
        }