]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/msg_types: fix the dencoder of entity_addr_t
authorKefu Chai <kchai@redhat.com>
Wed, 13 Sep 2017 09:21:38 +0000 (17:21 +0800)
committerKefu Chai <kchai@redhat.com>
Sat, 16 Sep 2017 04:02:36 +0000 (12:02 +0800)
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 <kchai@redhat.com>
src/msg/msg_types.h

index 9569fcf510117eb06203571066799f5e6e4be220..52ea81d5e9bef0f72888f79097cd1695f005a3c3 100644 (file)
@@ -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);
   }