Bump max_buffer_size for Deserializer

Since msgpack 0.6.0, some limits were introduced for the
deserializer which were put in to avoid any denial of service
attacks using msgpack.  These limits were raised to 100MiB
in the release of msgpack 1.0.0.

The default buffer sizes that were implemented were quite low
and when running certain `privsep` commands, especially for
Neutron when using linux bridge, where there is a large amount
of netdevs, privsep would crash since msgpack would fail to
decode the message since it considers it too big:

  ValueError: 1174941 exceeds max_str_len(1048576)

In this commit, the `max_buffer_size` is bumped to the value
that ships with msgpack==1.0.0 to allow for users who don't
have that to continue to function. Also, since `msgpack` is
only being used by the internal API, we're not worried about
a third party coming in and overwhelming the system by
deserializing calls.

This fix also addresses some weird behaviour where privsep
will die and certain OpenStack agents would start to behave
in a strange way once they hit a certain number of ports (since
any privsep calls would start to fail).

Closes-Bug: #1844822
Closes-Bug: #1896734
Related-Bug: #1928764
Closes-Bug: #1952611
Change-Id: I135917522daff95377d07566317ef0fc0d16e7cb
This commit is contained in:
Mohammed Naser 2021-12-01 11:19:26 +04:00
parent fa138406f7
commit c223dbced7

View File

@ -72,7 +72,8 @@ class Deserializer(six.Iterator):
self.readsock = readsock
self.unpacker = msgpack.Unpacker(use_list=False, raw=False,
strict_map_key=False,
unicode_errors='surrogateescape')
unicode_errors='surrogateescape',
max_buffer_size=100 * 1024 * 1024)
def __iter__(self):
return self