Patch #1504073: Fix tarfile.open() for mode "r" with a fileobj argument.

Backport from rev. 53161.
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index 4a41d9f..4c7dadb 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -1133,9 +1133,13 @@
             # Find out which *open() is appropriate for opening the file.
             for comptype in cls.OPEN_METH:
                 func = getattr(cls, cls.OPEN_METH[comptype])
+                if fileobj is not None:
+                    saved_pos = fileobj.tell()
                 try:
                     return func(name, "r", fileobj)
                 except (ReadError, CompressionError):
+                    if fileobj is not None:
+                        fileobj.seek(saved_pos)
                     continue
             raise ReadError("file could not be opened successfully")
 
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index fbcd191..692d72a 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -625,6 +625,15 @@
         self.assertEqual(tarfile.filemode(0755), '-rwxr-xr-x')
         self.assertEqual(tarfile.filemode(07111), '---s--s--t')
 
+class OpenFileobjTest(BaseTest):
+    # Test for SF bug #1496501.
+
+    def test_opener(self):
+        fobj = StringIO.StringIO("foo\n")
+        try:
+            tarfile.open("", "r", fileobj=fobj)
+        except tarfile.ReadError:
+            self.assertEqual(fobj.tell(), 0, "fileobj's position has moved")
 
 if bz2:
     # Bzip2 TestCases
@@ -670,6 +679,7 @@
 
     tests = [
         FileModeTest,
+        OpenFileobjTest,
         ReadTest,
         ReadStreamTest,
         ReadDetectTest,
diff --git a/Misc/NEWS b/Misc/NEWS
index 205ea40..9acc771 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -122,6 +122,8 @@
 Library
 -------
 
+- Patch #1504073: Fix tarfile.open() for mode "r" with a fileobj argument.
+
 - Patch #1262036: Prevent TarFiles from being added to themselves under
   certain conditions.