Don't use calculations on values gotten from tell().  Also use a
slightly different way to test for the existence of unread.
diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index fc244c5..2e97ef4 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -125,7 +125,14 @@
         self.status = ''
         headerseen = ""
         firstline = 1
+        startofline = unread = tell = None
+        if hasattr(self.fp, 'unread'):
+            unread = self.fp.unread
+        elif self.seekable:
+            tell = self.fp.tell
         while 1:
+            if tell:
+                startofline = tell()
             line = self.fp.readline()
             if not line:
                 self.status = 'EOF in headers'
@@ -160,10 +167,10 @@
                 else:
                     self.status = 'Non-header line where header expected'
                 # Try to undo the read.
-                if hasattr(self.fp, 'unread'):
-                    self.fp.unread(line)
-                elif self.seekable:
-                    self.fp.seek(-len(line), 1)
+                if unread:
+                    unread(line)
+                elif tell:
+                    self.fp.seek(startofline)
                 else:
                     self.status = self.status + '; bad seek'
                 break