Index: twisted/protocols/basic.py
===================================================================
--- twisted/protocols/basic.py	(revision 35333)
+++ twisted/protocols/basic.py	(working copy)
@@ -547,29 +547,29 @@
         rawDataReceived, depending on mode.)
         """
         self.__buffer = self.__buffer+data
-        while self.line_mode and not self.paused:
-            try:
-                line, self.__buffer = self.__buffer.split(self.delimiter, 1)
-            except ValueError:
-                if len(self.__buffer) > self.MAX_LENGTH:
-                    line, self.__buffer = self.__buffer, ''
-                    return self.lineLengthExceeded(line)
-                break
+        while not self.paused and self.__buffer:
+            if self.line_mode:
+                try:
+                    line, self.__buffer = self.__buffer.split(self.delimiter, 1)
+                except ValueError:
+                    if len(self.__buffer) > self.MAX_LENGTH:
+                        line, self.__buffer = self.__buffer, ''
+                        return self.lineLengthExceeded(line)
+                    break
+                else:
+                    linelength = len(line)
+                    if linelength > self.MAX_LENGTH:
+                        exceeded = line + self.__buffer
+                        self.__buffer = ''
+                        return self.lineLengthExceeded(exceeded)
+                    why = self.lineReceived(line)
+                    if why or self.transport and self.transport.disconnecting:
+                        return why
             else:
-                linelength = len(line)
-                if linelength > self.MAX_LENGTH:
-                    exceeded = line + self.__buffer
-                    self.__buffer = ''
-                    return self.lineLengthExceeded(exceeded)
-                why = self.lineReceived(line)
-                if why or self.transport and self.transport.disconnecting:
+                data, self.__buffer = self.__buffer, ''
+                why = self.rawDataReceived(data)
+                if why:
                     return why
-        else:
-            if not self.paused:
-                data=self.__buffer
-                self.__buffer=''
-                if data:
-                    return self.rawDataReceived(data)
 
 
     def setLineMode(self, extra=''):
@@ -586,7 +586,7 @@
         """
         self.line_mode = 1
         if extra:
-            return self.dataReceived(extra)
+            self.__buffer += extra
 
 
     def setRawMode(self):
