Skip to content

Commit c81669c

Browse files
felixxmnessita
authored andcommitted
[5.1.x] Fixed #36098 -- Fixed validate_ipv6_address()/validate_ipv46_address() crash for non-string values.
Regression in ca2be77. Backport of b3c5830 from main.
1 parent dd2247d commit c81669c

File tree

7 files changed

+68
-5
lines changed

7 files changed

+68
-5
lines changed

django/utils/ipv6.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,14 @@ def clean_ipv6_address(
5151
return str(addr)
5252

5353

54-
def is_valid_ipv6_address(ip_str):
54+
def is_valid_ipv6_address(ip_addr):
5555
"""
56-
Return whether or not the `ip_str` string is a valid IPv6 address.
56+
Return whether the `ip_addr` object is a valid IPv6 address.
5757
"""
58+
if isinstance(ip_addr, ipaddress.IPv6Address):
59+
return True
5860
try:
59-
_ipv6_address_from_str(ip_str)
60-
except ValueError:
61+
_ipv6_address_from_str(ip_addr)
62+
except (TypeError, ValueError):
6163
return False
6264
return True

docs/releases/4.2.19.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
===========================
2+
Django 4.2.19 release notes
3+
===========================
4+
5+
*Expected February 5, 2025*
6+
7+
Django 4.2.19 fixes a regression in 4.2.18.
8+
9+
Bugfixes
10+
========
11+
12+
* Fixed a regression in Django 4.2.18 that caused ``validate_ipv6_address()``
13+
and ``validate_ipv46_address()`` to crash when handling non-string values
14+
(:ticket:`36098`).

docs/releases/5.0.12.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
===========================
2+
Django 5.0.12 release notes
3+
===========================
4+
5+
*Expected February 5, 2025*
6+
7+
Django 5.0.12 fixes a regression in 5.0.11.
8+
9+
Bugfixes
10+
========
11+
12+
* Fixed a regression in Django 5.0.11 that caused ``validate_ipv6_address()``
13+
and ``validate_ipv46_address()`` to crash when handling non-string values
14+
(:ticket:`36098`).

docs/releases/5.1.6.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ Django 5.1.6 fixes several bugs in 5.1.5.
99
Bugfixes
1010
========
1111

12-
* ...
12+
* Fixed a regression in Django 5.1.5 that caused ``validate_ipv6_address()``
13+
and ``validate_ipv46_address()`` to crash when handling non-string values
14+
(:ticket:`36098`).

docs/releases/index.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ versions of the documentation contain the release notes for any later releases.
3838
.. toctree::
3939
:maxdepth: 1
4040

41+
5.0.12
4142
5.0.11
4243
5.0.10
4344
5.0.9
@@ -57,6 +58,7 @@ versions of the documentation contain the release notes for any later releases.
5758
.. toctree::
5859
:maxdepth: 1
5960

61+
4.2.19
6062
4.2.18
6163
4.2.17
6264
4.2.16

tests/utils_tests/test_ipv6.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import traceback
2+
from decimal import Decimal
23
from io import StringIO
4+
from ipaddress import IPv6Address
35

46
from django.core.exceptions import ValidationError
57
from django.test import SimpleTestCase
@@ -23,6 +25,16 @@ def test_validates_correct_with_v4mapping(self):
2325
self.assertTrue(is_valid_ipv6_address("::ffff:254.42.16.14"))
2426
self.assertTrue(is_valid_ipv6_address("::ffff:0a0a:0a0a"))
2527

28+
def test_validates_correct_with_ipv6_instance(self):
29+
cases = [
30+
IPv6Address("::ffff:2.125.160.216"),
31+
IPv6Address("fe80::1"),
32+
IPv6Address("::"),
33+
]
34+
for case in cases:
35+
with self.subTest(case=case):
36+
self.assertIs(is_valid_ipv6_address(case), True)
37+
2638
def test_validates_incorrect_plain_address(self):
2739
self.assertFalse(is_valid_ipv6_address("foo"))
2840
self.assertFalse(is_valid_ipv6_address("127.0.0.1"))
@@ -45,6 +57,12 @@ def test_validates_incorrect_with_v4mapping(self):
4557
self.assertFalse(is_valid_ipv6_address("::999.42.16.14"))
4658
self.assertFalse(is_valid_ipv6_address("::zzzz:0a0a"))
4759

60+
def test_validates_incorrect_with_non_string(self):
61+
cases = [None, [], {}, (), Decimal("2.46"), 192.168, 42]
62+
for case in cases:
63+
with self.subTest(case=case):
64+
self.assertIs(is_valid_ipv6_address(case), False)
65+
4866
def test_cleans_plain_address(self):
4967
self.assertEqual(clean_ipv6_address("DEAD::0:BEEF"), "dead::beef")
5068
self.assertEqual(

tests/validators/tests.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import ipaddress
12
import re
23
import types
34
from datetime import datetime, timedelta
@@ -383,15 +384,25 @@
383384
(validate_ipv6_address, "fe80::1", None),
384385
(validate_ipv6_address, "::1", None),
385386
(validate_ipv6_address, "1:2:3:4:5:6:7:8", None),
387+
(validate_ipv6_address, ipaddress.IPv6Address("::ffff:2.125.160.216"), None),
388+
(validate_ipv6_address, ipaddress.IPv6Address("fe80::1"), None),
389+
(validate_ipv6_address, Decimal("33.1"), ValidationError),
390+
(validate_ipv6_address, 9.22, ValidationError),
386391
(validate_ipv6_address, "1:2", ValidationError),
387392
(validate_ipv6_address, "::zzz", ValidationError),
388393
(validate_ipv6_address, "12345::", ValidationError),
389394
(validate_ipv46_address, "1.1.1.1", None),
390395
(validate_ipv46_address, "255.0.0.0", None),
391396
(validate_ipv46_address, "0.0.0.0", None),
397+
(validate_ipv46_address, ipaddress.IPv4Address("1.1.1.1"), None),
398+
(validate_ipv46_address, ipaddress.IPv4Address("255.0.0.0"), None),
392399
(validate_ipv46_address, "fe80::1", None),
393400
(validate_ipv46_address, "::1", None),
394401
(validate_ipv46_address, "1:2:3:4:5:6:7:8", None),
402+
(validate_ipv46_address, ipaddress.IPv6Address("::ffff:2.125.160.216"), None),
403+
(validate_ipv46_address, ipaddress.IPv6Address("fe80::1"), None),
404+
(validate_ipv46_address, Decimal("33.1"), ValidationError),
405+
(validate_ipv46_address, 9.22, ValidationError),
395406
(validate_ipv46_address, "256.1.1.1", ValidationError),
396407
(validate_ipv46_address, "25.1.1.", ValidationError),
397408
(validate_ipv46_address, "25,1,1,1", ValidationError),

0 commit comments

Comments
 (0)