From 9b7a1a1af6de71411102e2b95ee3f654cb0cc700 Mon Sep 17 00:00:00 2001
From: Serhiy Storchaka <storchaka@gmail.com>
Date: Mon, 20 Jan 2014 21:57:40 +0200
Subject: [PATCH] Issue #20262: Warnings are raised now when duplicate names
 are added in the ZIP file or too long ZIP file comment is truncated.

---
 Lib/test/test_zipfile.py |  7 +++++--
 Lib/zipfile.py           | 12 ++++++------
 Misc/NEWS                |  3 +++
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index a561d59bc7..12a0f71f5d 100644
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -844,7 +844,9 @@ class OtherTests(unittest.TestCase):
         # Create the ZIP archive
         with zipfile.ZipFile(TESTFN2, "w", zipfile.ZIP_STORED) as zipfp:
             zipfp.writestr("name", "foo")
-            zipfp.writestr("name", "bar")
+            with self.assertWarns(UserWarning):
+                zipfp.writestr("name", "bar")
+            self.assertEqual(zipfp.namelist(), ["name"] * 2)
 
         with zipfile.ZipFile(TESTFN2, "r") as zipfp:
             infos = zipfp.infolist()
@@ -1150,7 +1152,8 @@ class OtherTests(unittest.TestCase):
 
         # check a comment that is too long is truncated
         with zipfile.ZipFile(TESTFN, mode="w") as zipf:
-            zipf.comment = comment2 + b'oops'
+            with self.assertWarns(UserWarning):
+                zipf.comment = comment2 + b'oops'
             zipf.writestr("foo.txt", "O, for a Muse of Fire!")
         with zipfile.ZipFile(TESTFN, mode="r") as zipfr:
             self.assertEqual(zipfr.comment, comment2)
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index a1b34147f8..ff64c90829 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -1102,10 +1102,10 @@ class ZipFile:
         if not isinstance(comment, bytes):
             raise TypeError("comment: expected bytes, got %s" % type(comment))
         # check for valid comment length
-        if len(comment) >= ZIP_MAX_COMMENT:
-            if self.debug:
-                print('Archive comment is too long; truncating to %d bytes'
-                        % ZIP_MAX_COMMENT)
+        if len(comment) > ZIP_MAX_COMMENT:
+            import warnings
+            warnings.warn('Archive comment is too long; truncating to %d bytes'
+                          % ZIP_MAX_COMMENT, stacklevel=2)
             comment = comment[:ZIP_MAX_COMMENT]
         self._comment = comment
         self._didModify = True
@@ -1290,8 +1290,8 @@ class ZipFile:
     def _writecheck(self, zinfo):
         """Check for errors before writing a file to the archive."""
         if zinfo.filename in self.NameToInfo:
-            if self.debug:      # Warning for duplicate names
-                print("Duplicate name:", zinfo.filename)
+            import warnings
+            warnings.warn('Duplicate name: %r' % zinfo.filename, stacklevel=3)
         if self.mode not in ("w", "a"):
             raise RuntimeError('write() requires mode "w" or "a"')
         if not self.fp:
diff --git a/Misc/NEWS b/Misc/NEWS
index c95e45f5a1..62ffaa508a 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -43,6 +43,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #20262: Warnings are raised now when duplicate names are added in the
+  ZIP file or too long ZIP file comment is truncated.
+
 - Issue #18574: Added missing newline in 100-Continue reply from
   http.server.BaseHTTPRequestHandler. Patch by Nikolaus Rath.
 
-- 
2.40.0