]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/msg_types: fix the dencoder of entity_addr_t 26042/head
authorKefu Chai <kchai@redhat.com>
Wed, 13 Sep 2017 09:21:38 +0000 (17:21 +0800)
committerMykola Golub <mgolub@suse.com>
Sat, 19 Jan 2019 16:15:45 +0000 (18:15 +0200)
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>
(cherry picked from commit 9099ca599de5238cde917f1e1f933247392de03e)

src/msg/msg_types.h

index 1e048204d8bf67d45a58701a58b9d5256de8e047..e9998799bb43bd6173d18570ed675f94e7422916 100644 (file)
@@ -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);
   }