From: Kefu Chai Date: Wed, 13 Sep 2017 09:21:38 +0000 (+0800) Subject: msg/msg_types: fix the dencoder of entity_addr_t X-Git-Tag: v13.0.1~880^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9099ca599de5238cde917f1e1f933247392de03e;p=ceph.git msg/msg_types: fix the dencoder of entity_addr_t improve the interoperability between freebsd/osx and GNU/Linux, because the their layouts of sockaddr_storage are different, and we use the one of linux as the wire format. so need to convert it on freebsd/osx side. Signed-off-by: Kefu Chai --- diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index 9569fcf5101..52ea81d5e9b 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -444,7 +444,14 @@ struct entity_addr_t { __u32 elen = get_sockaddr_len(); ::encode(elen, bl); if (elen) { +#if (__FreeBSD__) || defined(__APPLE__) + __le16 ss_family = u.sa.sa_family; + ::encode(ss_family, bl); + bl.append(u.sa.sa_data, + elen - sizeof(u.sa.sa_len) - sizeof(u.sa.sa_family)); +#else bl.append((char*)get_sockaddr(), elen); +#endif } ENCODE_FINISH(bl); } @@ -463,6 +470,20 @@ struct entity_addr_t { __u32 elen; ::decode(elen, bl); if (elen) { +#if defined(__FreeBSD__) || defined(__APPLE__) + u.sa.sa_len = 0; + __le16 ss_family; + if (elen < sizeof(ss_family)) { + throw buffer::malformed_input("elen smaller than family len"); + } + ::decode(ss_family, bl); + u.sa.sa_family = ss_family; + elen -= sizeof(ss_family); + if (elen > get_sockaddr_len() - sizeof(u.sa.sa_family)) { + throw buffer::malformed_input("elen exceeds sockaddr len"); + } + bl.copy(elen, u.sa.sa_data); +#else if (elen < sizeof(u.sa.sa_family)) { throw buffer::malformed_input("elen smaller than family len"); } @@ -472,6 +493,7 @@ struct entity_addr_t { } elen -= sizeof(u.sa.sa_family); bl.copy(elen, u.sa.sa_data); +#endif } DECODE_FINISH(bl); }