Browse Source

UI: Size the abstract-socket address properly

Unlike filesystem addresses, which are paths,
abstract addresses are blobs.

This means that the address wasn't "\0/com/obsproject 2413747 version",
but rather "\0/com/obsproject 2402613 version\0\0\0\0\0\0\0\0\0\0\0\0\0
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
this is reflected in both /proc/net/unix:
  000000001bf56057: 00000002 00000000 00000000 0002 01 56719817
                    @/com/obsproject 2402613 version@@@@@@@@@@@
                    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                    @@@@@@@@@@@@@@@@@@@@@@
  000000003e897b41: 00000002 00000000 00000000 0002 01 56730132
                    @/com/obsproject 2413747 version
and ss -l, extending the whole address column to the point of
unusability.

This size calculation follows trivially from the manual,
and naturally behaves correctly, as above.
наб 1 year ago
parent
commit
87902cb106
1 changed files with 5 additions and 4 deletions
  1. 5 4
      UI/platform-x11.cpp

+ 5 - 4
UI/platform-x11.cpp

@@ -67,12 +67,13 @@ void CheckIfAlreadyRunning(bool &already_running)
 	struct sockaddr_un bindInfo;
 	memset(&bindInfo, 0, sizeof(sockaddr_un));
 	bindInfo.sun_family = AF_LOCAL;
-	snprintf(bindInfo.sun_path + 1, sizeof(bindInfo.sun_path) - 1,
-		 "%s %d %s", "/com/obsproject", getpid(),
-		 App()->GetVersionString().c_str());
+	auto bindInfoStrlen = snprintf(bindInfo.sun_path + 1,
+				       sizeof(bindInfo.sun_path) - 1,
+				       "%s %d %s", "/com/obsproject", getpid(),
+				       App()->GetVersionString().c_str());
 
 	int bindErr = bind(uniq, (struct sockaddr *)&bindInfo,
-			   sizeof(struct sockaddr_un));
+			   sizeof(sa_family_t) + 1 + bindInfoStrlen);
 	already_running = bindErr == 0 ? 0 : 1;
 
 	if (already_running) {