numam-dpdk/lib
Stefan Hajnoczi cdc37ca3d0 vhost: avoid enum fields in VhostUserMsg
The VhostUserMsg struct binary representation must match the vhost-user
protocol specification since this struct is read from and written to the
socket.

The VhostUserMsg.request union contains enum fields.  Enum binary
representation is implementation-defined according to the C standard and
it is unportable to make assumptions about the representation:

  6.7.2.2 Enumeration specifiers
  ...
  Each enumerated type shall be compatible with char, a signed integer
  type, or an unsigned integer type. The choice of type is
  implementation-defined, but shall be capable of representing the
  values of all the members of the enumeration.

Additionally, librte_vhost relies on the enum type being unsigned when
validating untrusted inputs:

  if (ret <= 0 || msg.request.master >= VHOST_USER_MAX) {

If msg.request.master is signed then negative values pass this check!

Even if we assume gcc on x86_64 (SysV amd64 ABI) and don't care about
portability, the actual enum constants still affect the final type.  For
example, if we add a negative constant then its type changes to signed
int:

  typedef enum VhostUserRequest {
      ...
      VHOST_USER_INVALID = -1,
  };

This is very fragile and it's unlikely that anyone changing the code
would remember this.  A security hole can be introduced accidentally.

This patch switches VhostUserMsg.request fields to uint32_t to avoid the
portability and potential security issues.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
2018-03-30 14:08:42 +02:00
..
librte_acl build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_bbdev bbdev: fix exported dynamic log type 2018-02-06 18:51:44 +01:00
librte_bitratestats bitratestats: fix library version in meson build 2018-03-28 00:07:35 +02:00
librte_cfgfile build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_cmdline cmdline: use SPDX tags 2018-02-01 02:27:22 +01:00
librte_compat compat: relicense some files 2018-02-06 23:13:47 +01:00
librte_cryptodev cryptodev: fix library version in meson build 2018-03-28 00:07:35 +02:00
librte_distributor build: set compat lib as universal dependency 2018-01-30 21:59:00 +01:00
librte_eal move kernel modules directories 2018-03-21 23:04:21 +01:00
librte_efd build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_ether ethdev: increase log level of port allocation failure 2018-02-13 16:32:16 +01:00
librte_eventdev eventdev: fix library version in meson build 2018-03-28 00:07:35 +02:00
librte_flow_classify build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_gro build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_gso build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_hash build: set compat lib as universal dependency 2018-01-30 21:59:00 +01:00
librte_ip_frag build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_jobstats build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_kni kni: set initial value for MTU 2018-02-01 01:03:26 +01:00
librte_kvargs kvargs: fix syntax in comments 2018-03-28 00:43:22 +02:00
librte_latencystats build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_lpm lpm: fix allocation of an existing object 2018-02-01 00:35:06 +01:00
librte_mbuf mbuf: fix logic of user mempool ops API 2018-02-06 01:02:12 +01:00
librte_member build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_mempool mempool: fix library version in meson build 2018-03-28 00:07:35 +02:00
librte_meter meter: fix library version in meson build 2018-03-28 00:07:35 +02:00
librte_metrics build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_net net: use SPDX tags 2018-02-01 02:27:22 +01:00
librte_pci pci: remove duplicated symbol from map file 2018-03-22 17:34:48 +01:00
librte_pdump pdump: fix library version in meson build 2018-03-28 00:07:35 +02:00
librte_pipeline build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_port build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_power build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_rawdev rawdev: add self test 2018-01-31 15:35:56 +01:00
librte_reorder build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_ring lib: remove unused map symbols 2018-02-13 14:55:01 +01:00
librte_sched build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_security build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_table table: fix library version in meson build 2018-03-28 00:07:35 +02:00
librte_timer build: replace license text with SPDX tag 2018-01-30 21:58:59 +01:00
librte_vhost vhost: avoid enum fields in VhostUserMsg 2018-03-30 14:08:42 +02:00
Makefile rawdev: introduce raw device library 2018-01-31 15:35:01 +01:00
meson.build build: detect micro-arch on ARM 2018-01-30 21:59:00 +01:00