Skip to content

Commit f46022e

Browse files
committed
Raise ValueError if padding bits are not zero
Closes #16.
1 parent eaf1943 commit f46022e

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

temporenc/temporenc.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ def unpackb(value):
800800
"got {3:d}".format(
801801
type, precision, expected_length, len(value)))
802802

803-
date = time = tz_offset = nanosecond = None
803+
date = time = tz_offset = nanosecond = padding = None
804804

805805
if type == 'D':
806806
# 100DDDDD DDDDDDDD DDDDDDDD
@@ -838,10 +838,12 @@ def unpackb(value):
838838
# 01PPDDDD DDDDDDDD DDDDDDDD DTTTTTTT
839839
# TTTTTTTT TTSSSSSS SSSS0000
840840
nanosecond = (n >> 4 & MILLISECOND_MASK) * 1000000
841+
padding = n & 0b1111
841842
elif precision == 0b01:
842843
# 01PPDDDD DDDDDDDD DDDDDDDD DTTTTTTT
843844
# TTTTTTTT TTSSSSSS SSSSSSSS SSSSSS00
844845
nanosecond = (n >> 2 & MICROSECOND_MASK) * 1000
846+
padding = n & 0b11
845847
elif precision == 0b10:
846848
# 01PPDDDD DDDDDDDD DDDDDDDD DTTTTTTT
847849
# TTTTTTTT TTSSSSSS SSSSSSSS SSSSSSSS
@@ -850,7 +852,7 @@ def unpackb(value):
850852
elif precision == 0b11:
851853
# 01PPDDDD DDDDDDDD DDDDDDDD DTTTTTTT
852854
# TTTTTTTT TT000000
853-
pass
855+
padding = n & 0b111111
854856

855857
elif type == 'DTSZ':
856858
# 111PPDDD DDDDDDDD DDDDDDDD DDTTTTTT
@@ -866,12 +868,14 @@ def unpackb(value):
866868
# TTTTTTTT TTTSSSSS SSSSSZZZ ZZZZ0000
867869
nanosecond = (n >> 11 & MILLISECOND_MASK) * 1000000
868870
tz_offset = n >> 4 & Z_MASK
871+
padding = n & 0b1111
869872
elif precision == 0b01:
870873
# 111PPDDD DDDDDDDD DDDDDDDD DDTTTTTT
871874
# TTTTTTTT TTTSSSSS SSSSSSSS SSSSSSSZ
872875
# ZZZZZZ00
873876
nanosecond = (n >> 9 & MICROSECOND_MASK) * 1000
874877
tz_offset = n >> 2 & Z_MASK
878+
padding = n & 0b11
875879
elif precision == 0b10:
876880
# 111PPDDD DDDDDDDD DDDDDDDD DDTTTTTT
877881
# TTTTTTTT TTTSSSSS SSSSSSSS SSSSSSSS
@@ -882,6 +886,10 @@ def unpackb(value):
882886
# 111PPDDD DDDDDDDD DDDDDDDD DDTTTTTT
883887
# TTTTTTTT TTTZZZZZ ZZ000000
884888
tz_offset = n >> 6 & Z_MASK
889+
padding = n & 0b111111
890+
891+
if padding:
892+
raise ValueError("padding bits must be zero")
885893

886894
#
887895
# Split D and T components

tests/test_temporenc.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,14 @@ def test_out_of_range_values():
293293

294294

295295
def test_unpacking_bogus_data():
296-
with pytest.raises(ValueError):
296+
with pytest.raises(ValueError) as e:
297297
# First byte can never occur in valid values.
298298
temporenc.unpackb(from_hex('bb 12 34'))
299+
assert 'tag' in str(e.value)
300+
301+
with pytest.raises(ValueError) as e:
302+
temporenc.unpackb(from_hex('47 bf 07 49 93 07 b2'))
303+
assert 'padding' in str(e.value)
299304

300305

301306
def test_range_check_unpacking():

0 commit comments

Comments
 (0)