Skip to content

Commit 8f1ac17

Browse files
authored
Merge pull request #5258 from dstufft/fix-msgpack
Fix msgpack on older versions of Python 2.7
2 parents eaa2d0c + 28ff2b3 commit 8f1ac17

File tree

3 files changed

+236
-25
lines changed

3 files changed

+236
-25
lines changed

news/5231.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix a TypeError when loading the cache on older versions of Python 2.7.

src/pip/_vendor/msgpack/fallback.py

+31-25
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,12 @@ def __init__(self, file_like=None, read_size=0, use_list=True, raw=True,
234234

235235
#: array of bytes fed.
236236
self._buffer = bytearray()
237+
# Some very old pythons don't support `struct.unpack_from()` with a
238+
# `bytearray`. So we wrap it in a `buffer()` there.
239+
if sys.version_info < (2, 7, 6):
240+
self._buffer_view = buffer(self._buffer)
241+
else:
242+
self._buffer_view = self._buffer
237243
#: Which position we currently reads
238244
self._buff_i = 0
239245

@@ -388,117 +394,117 @@ def _read_header(self, execute=EX_CONSTRUCT):
388394
elif b == 0xc5:
389395
typ = TYPE_BIN
390396
self._reserve(2)
391-
n = struct.unpack_from(">H", self._buffer, self._buff_i)[0]
397+
n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0]
392398
self._buff_i += 2
393399
if n > self._max_bin_len:
394400
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
395401
obj = self._read(n)
396402
elif b == 0xc6:
397403
typ = TYPE_BIN
398404
self._reserve(4)
399-
n = struct.unpack_from(">I", self._buffer, self._buff_i)[0]
405+
n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0]
400406
self._buff_i += 4
401407
if n > self._max_bin_len:
402408
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
403409
obj = self._read(n)
404410
elif b == 0xc7: # ext 8
405411
typ = TYPE_EXT
406412
self._reserve(2)
407-
L, n = struct.unpack_from('Bb', self._buffer, self._buff_i)
413+
L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i)
408414
self._buff_i += 2
409415
if L > self._max_ext_len:
410416
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
411417
obj = self._read(L)
412418
elif b == 0xc8: # ext 16
413419
typ = TYPE_EXT
414420
self._reserve(3)
415-
L, n = struct.unpack_from('>Hb', self._buffer, self._buff_i)
421+
L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i)
416422
self._buff_i += 3
417423
if L > self._max_ext_len:
418424
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
419425
obj = self._read(L)
420426
elif b == 0xc9: # ext 32
421427
typ = TYPE_EXT
422428
self._reserve(5)
423-
L, n = struct.unpack_from('>Ib', self._buffer, self._buff_i)
429+
L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i)
424430
self._buff_i += 5
425431
if L > self._max_ext_len:
426432
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
427433
obj = self._read(L)
428434
elif b == 0xca:
429435
self._reserve(4)
430-
obj = struct.unpack_from(">f", self._buffer, self._buff_i)[0]
436+
obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0]
431437
self._buff_i += 4
432438
elif b == 0xcb:
433439
self._reserve(8)
434-
obj = struct.unpack_from(">d", self._buffer, self._buff_i)[0]
440+
obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0]
435441
self._buff_i += 8
436442
elif b == 0xcc:
437443
self._reserve(1)
438444
obj = self._buffer[self._buff_i]
439445
self._buff_i += 1
440446
elif b == 0xcd:
441447
self._reserve(2)
442-
obj = struct.unpack_from(">H", self._buffer, self._buff_i)[0]
448+
obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0]
443449
self._buff_i += 2
444450
elif b == 0xce:
445451
self._reserve(4)
446-
obj = struct.unpack_from(">I", self._buffer, self._buff_i)[0]
452+
obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0]
447453
self._buff_i += 4
448454
elif b == 0xcf:
449455
self._reserve(8)
450-
obj = struct.unpack_from(">Q", self._buffer, self._buff_i)[0]
456+
obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0]
451457
self._buff_i += 8
452458
elif b == 0xd0:
453459
self._reserve(1)
454-
obj = struct.unpack_from("b", self._buffer, self._buff_i)[0]
460+
obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0]
455461
self._buff_i += 1
456462
elif b == 0xd1:
457463
self._reserve(2)
458-
obj = struct.unpack_from(">h", self._buffer, self._buff_i)[0]
464+
obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0]
459465
self._buff_i += 2
460466
elif b == 0xd2:
461467
self._reserve(4)
462-
obj = struct.unpack_from(">i", self._buffer, self._buff_i)[0]
468+
obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0]
463469
self._buff_i += 4
464470
elif b == 0xd3:
465471
self._reserve(8)
466-
obj = struct.unpack_from(">q", self._buffer, self._buff_i)[0]
472+
obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0]
467473
self._buff_i += 8
468474
elif b == 0xd4: # fixext 1
469475
typ = TYPE_EXT
470476
if self._max_ext_len < 1:
471477
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len))
472478
self._reserve(2)
473-
n, obj = struct.unpack_from("b1s", self._buffer, self._buff_i)
479+
n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i)
474480
self._buff_i += 2
475481
elif b == 0xd5: # fixext 2
476482
typ = TYPE_EXT
477483
if self._max_ext_len < 2:
478484
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len))
479485
self._reserve(3)
480-
n, obj = struct.unpack_from("b2s", self._buffer, self._buff_i)
486+
n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i)
481487
self._buff_i += 3
482488
elif b == 0xd6: # fixext 4
483489
typ = TYPE_EXT
484490
if self._max_ext_len < 4:
485491
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len))
486492
self._reserve(5)
487-
n, obj = struct.unpack_from("b4s", self._buffer, self._buff_i)
493+
n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i)
488494
self._buff_i += 5
489495
elif b == 0xd7: # fixext 8
490496
typ = TYPE_EXT
491497
if self._max_ext_len < 8:
492498
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len))
493499
self._reserve(9)
494-
n, obj = struct.unpack_from("b8s", self._buffer, self._buff_i)
500+
n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i)
495501
self._buff_i += 9
496502
elif b == 0xd8: # fixext 16
497503
typ = TYPE_EXT
498504
if self._max_ext_len < 16:
499505
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len))
500506
self._reserve(17)
501-
n, obj = struct.unpack_from("b16s", self._buffer, self._buff_i)
507+
n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i)
502508
self._buff_i += 17
503509
elif b == 0xd9:
504510
typ = TYPE_RAW
@@ -511,43 +517,43 @@ def _read_header(self, execute=EX_CONSTRUCT):
511517
elif b == 0xda:
512518
typ = TYPE_RAW
513519
self._reserve(2)
514-
n, = struct.unpack_from(">H", self._buffer, self._buff_i)
520+
n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
515521
self._buff_i += 2
516522
if n > self._max_str_len:
517523
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
518524
obj = self._read(n)
519525
elif b == 0xdb:
520526
typ = TYPE_RAW
521527
self._reserve(4)
522-
n, = struct.unpack_from(">I", self._buffer, self._buff_i)
528+
n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
523529
self._buff_i += 4
524530
if n > self._max_str_len:
525531
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
526532
obj = self._read(n)
527533
elif b == 0xdc:
528534
typ = TYPE_ARRAY
529535
self._reserve(2)
530-
n, = struct.unpack_from(">H", self._buffer, self._buff_i)
536+
n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
531537
self._buff_i += 2
532538
if n > self._max_array_len:
533539
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
534540
elif b == 0xdd:
535541
typ = TYPE_ARRAY
536542
self._reserve(4)
537-
n, = struct.unpack_from(">I", self._buffer, self._buff_i)
543+
n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
538544
self._buff_i += 4
539545
if n > self._max_array_len:
540546
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
541547
elif b == 0xde:
542548
self._reserve(2)
543-
n, = struct.unpack_from(">H", self._buffer, self._buff_i)
549+
n, = struct.unpack_from(">H", self._buffer_view, self._buff_i)
544550
self._buff_i += 2
545551
if n > self._max_map_len:
546552
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
547553
typ = TYPE_MAP
548554
elif b == 0xdf:
549555
self._reserve(4)
550-
n, = struct.unpack_from(">I", self._buffer, self._buff_i)
556+
n, = struct.unpack_from(">I", self._buffer_view, self._buff_i)
551557
self._buff_i += 4
552558
if n > self._max_map_len:
553559
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)

0 commit comments

Comments
 (0)