Skip to content

Commit b251330

Browse files
committed
Avoid mark 4 header words turning into numpy signed integers
1 parent 5cf56d1 commit b251330

4 files changed

Lines changed: 22 additions & 6 deletions

File tree

CHANGES.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
Bug fixes
99
---------
1010

11-
- Ensure headers words are never turned into signed 32-bit numpy integers.
11+
- Ensure headers words are never turned into signed 32- or 64-bit numpy
12+
integers. [#538, #540]
13+
1214

1315
4.3 (2025-03-10)
1416
================

baseband/base/header.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,18 @@ def setter(words, value):
118118
raise ValueError("no default value so cannot set to 'None'.")
119119
value = default
120120
elif value is True:
121+
# Special case: may set multiple bits in invariant masks.
121122
value = bit_mask
122-
elif np.any(value & bit_mask != value):
123-
raise ValueError("{0} cannot be represented with {1} bits"
124-
.format(value, bit_length))
123+
else:
124+
if isinstance(value, (np.integer, np.bool)):
125+
# Turn into integer to avoid influencing promotion.
126+
value = int(value)
127+
if np.any(value & bit_mask != value):
128+
raise ValueError("{0} cannot be represented with {1} bits"
129+
.format(value, bit_length))
130+
125131
if bit_length == 64:
126-
word1 = value & (1 << 32) - 1
132+
word1 = value & 0xffffffff
127133
word2 = value >> 32
128134
words[word_index] = word1
129135
words[word_index + 1] = word2

baseband/mark4/header.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def fraction(self, fraction):
218218
raise ValueError("{0} ms is not a multiple of 1.25 ms"
219219
.format(ms))
220220
self['bcd_fraction'] = bcd_encode(np.floor(ms + 1e-6)
221-
.astype(np.int32))
221+
.astype(np.uint32))
222222

223223
def get_time(self):
224224
"""Convert BCD time code to Time object.

baseband/mark4/tests/test_mark4.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ def test_header(self, tmpdir):
224224
assert header13.ntrack == 53
225225
assert abs(header13.time - header.time) < 1. * u.ns
226226

227+
@pytest.mark.parametrize("value", [1, np.int32(1), np.int64(1)])
228+
def test_header_word_type(self, value):
229+
# Regression test for numpy scalars influencing the type of the words.
230+
header = Mark4TrackHeader(words=None)
231+
header["converter_id"] = value
232+
assert isinstance(header.words, list)
233+
assert all(type(w) is int for w in header.words)
234+
227235
def test_invariant_pattern(self):
228236
with open(SAMPLE_FILE, 'rb') as fh:
229237
fh.seek(0xa88)

0 commit comments

Comments
 (0)