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: v12.2.12~72^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ee94cf482386f1a12d2e5e8af513a72f9a377169;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 (cherry picked from commit 9099ca599de5238cde917f1e1f933247392de03e) --- diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index 1e048204d8b..e9998799bb4 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -435,7 +435,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); } @@ -454,6 +461,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"); } @@ -463,6 +484,7 @@ struct entity_addr_t { } elen -= sizeof(u.sa.sa_family); bl.copy(elen, u.sa.sa_data); +#endif } DECODE_FINISH(bl); }