Fix to using abstract namespace socket 63/316163/9
authorSangyoon Jang <jeremy.jang@samsung.com>
Wed, 11 Dec 2024 06:06:00 +0000 (15:06 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Wed, 18 Dec 2024 04:35:36 +0000 (13:35 +0900)
Change-Id: Ibcfe231c2b20a53590048347410dfbe20752a169
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
packaging/pkgmgr-info.socket
src/common/socket/abstract_socket.cc
src/common/socket/client_socket.cc
src/common/socket/server_socket.cc

index 86b32053a74ecdc37387be76e754c4d1acce73c7..ecd7037eba901e783ad3f3bc74135fa29f59985e 100755 (executable)
@@ -4,7 +4,7 @@ DefaultDependencies=no
 Before=sockets.target
 
 [Socket]
-ListenStream=/run/pkgmgr-info-server
+ListenStream=@/run/pkgmgr-info-server
 SocketMode=0666
 SmackLabelIPIn=*
 SmackLabelIPOut=@
index d80705c4fed091ac02d4eb37bff1119d8c646fae..3e6d9456e80b3c6df652bfaeb7d0d3625835a31e 100644 (file)
@@ -155,7 +155,9 @@ int AbstractSocket::Create() {
   }
 
   addr_.sun_family = AF_UNIX;
-  snprintf(addr_.sun_path, sizeof(addr_.sun_path), "%s", path_.c_str());
+  // abstract namespace socket address should start with null character.
+  addr_.sun_path[0] = '\0';
+  snprintf(addr_.sun_path + 1, sizeof(addr_.sun_path) - 1, "%s", path_.c_str());
   SetOption();
   GetFdInfo();
   return 0;
index 2cf574f9b36c4360e90eaba0e63ce3c96a851e86..7918f59ee1c9d9279b473bcc150a9cb84a5c5c73 100644 (file)
@@ -119,8 +119,9 @@ int ClientSocket::TryConnection() {
     return -1;
   }
 
-  int ret =
-      connect(fd_, reinterpret_cast<struct sockaddr*>(&addr_), sizeof(addr_));
+  // +1 for '\0' prefix (abstract namespace socket)
+  size_t len = offsetof(struct sockaddr_un, sun_path) + GetPath().length() + 1;
+  int ret = connect(fd_, reinterpret_cast<struct sockaddr*>(&addr_), len);
   if (fcntl(fd_, F_SETFL, flags) != 0) {
     LOG(ERROR) << "Failed to set flags: " << flags << " on fd: " << fd_
         << ", errno: " <<  errno;
index 0d72d535d13e837a2f821b71d1fa21e7e869e46a..8b18202d8a13907d710ca6103ef3fe7f63efca46 100644 (file)
@@ -33,22 +33,28 @@ namespace socket {
 
 ServerSocket::ServerSocket(std::string path) : AbstractSocket(std::move(path)) {
   int n = sd_listen_fds(0);
+  char buf[108];
+  // prefix '\0' should be added to make it abstract namespace socket.
+  buf[0] = '\0';
+  snprintf(buf + 1, sizeof(buf) - 1, "%s", path_.c_str());
 
   for (int i = SD_LISTEN_FDS_START; i < SD_LISTEN_FDS_START + n; ++i) {
-    if (sd_is_socket_unix(i, SOCK_STREAM, 1, path_.c_str(), 0) > 0) {
+    if (sd_is_socket_unix(i, SOCK_STREAM, 1, buf, path_.size() + 1) > 0) {
       fd_ = i;
       break;
     }
   }
 
   if (fd_ == -1) {
+    LOG(WARNING) << "Failed to find socket from systemd.";
     if (Create() < 0) {
       LOG(ERROR) << "Fail to create server socket. errno: " << errno;
       return;
     }
 
     addr_.sun_family = AF_UNIX;
-    snprintf(addr_.sun_path, sizeof(addr_.sun_path), "%s", path_.c_str());
+    addr_.sun_path[0] = '\0';
+    snprintf(addr_.sun_path + 1, sizeof(addr_.sun_path) - 1, "%s", path_.c_str());
     if (access(path_.c_str(), F_OK) == 0) {
       LOG(WARNING) << "socket is already in use : " << path_;
       unlink(path_.c_str());
@@ -71,7 +77,8 @@ ServerSocket::ServerSocket(std::string path) : AbstractSocket(std::move(path)) {
 }
 
 int ServerSocket::Bind() {
-  return bind(fd_, reinterpret_cast<struct sockaddr*>(&addr_), sizeof(addr_));
+  size_t len = offsetof(struct sockaddr_un, sun_path) + path_.length() + 1;
+  return bind(fd_, reinterpret_cast<struct sockaddr*>(&addr_), len);
 }
 
 int ServerSocket::Listen() { return listen(fd_, 128); }