Allowed a left byte of zero in mixed IPv4/IPv6 validation
Basically, IPv4-mapped IPv6 addresses in the CIDR block ::ffff:0.0.0.0/104 are validated as invalid when unpack_ipv4=False, yet is valid when the first IPv4 octet is non-zero or when unpack_ipv4=True.
# my.app.models
# Django==1.8.6
from django.db import models
class TestIPNoUnpack(models.Model):
ip = models.GenericIPAddressField(null=False, protocol='both', unpack_ipv4=False)
class TestIPUnpack(models.Model):
ip = models.GenericIPAddressField(null=False, protocol='both', unpack_ipv4=True)
> python manage.py shell
In [1]: from my.app.models import TestIPNoUnpack, TestIPUnpack
In [2]: testipunpack = TestIPUnpack(ip='::ffff:0.0.0.0')
In [3]: testipunpack.clean_fields()
In [4]: testipunpack.ip
Out[4]: '0.0.0.0'
In [5]: testipnounpack = TestIPNoUnpack(ip='::ffff:0.0.0.0')
In [6]: testipnounpack.clean_fields()
ValidationError: {'ip': [u'Enter a valid IPv4 or IPv6 address.']}
In [7]: testipnounpack2 = TestIPNoUnpack(ip='::ffff:0.255.255.255')
In [8]: testipnounpack2.clean_fields()
ValidationError: {'ip': [u'Enter a valid IPv4 or IPv6 address.']}
In [9]: testipnounpack3 = TestIPNoUnpack(ip='::ffff:1.0.0.0')
In [10]: testipnounpack3.clean_fields()
In [11]: testipnounpack3.ip
Out[11]: '::ffff:1.0.0.0'
Change History
(13)
Cc: |
bshen added
|
Component: |
Uncategorized → Database layer (models, ORM)
|
Easy pickings: |
set
|
Description: |
modified (diff)
|
Owner: |
changed from nobody to Amine Yaiche
|
Status: |
new → assigned
|
Triage Stage: |
Unreviewed → Accepted
|
Description: |
modified (diff)
|
Summary: |
Incorrect behavior in GenericIPAddressField with protocol='both', unpack_ipv4=False → Allowed a left byte of zero in mixed IPv4/IPv6 validation
|
Triage Stage: |
Accepted → Ready for checkin
|
Resolution: |
→ fixed
|
Status: |
assigned → closed
|
PR