]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:winbind: Do not start if the priviliged socket path is too long
authorAndreas Schneider <asn@samba.org>
Wed, 11 Aug 2021 10:07:57 +0000 (12:07 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 12 Aug 2021 19:19:28 +0000 (19:19 +0000)
https://bugzilla.samba.org/show_bug.cgi?id=14792

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/winbindd/winbindd.c

index 89e62b43ca05d0ddae87485519b1a3d55ca3b135..0caea1be56e7ee2145ffcc06ccedcde9d99e292c 100644 (file)
@@ -1659,6 +1659,8 @@ int main(int argc, const char **argv)
        const struct dcesrv_endpoint_server *ep_server = NULL;
        struct dcesrv_context *dce_ctx = NULL;
        size_t winbindd_socket_dir_len = 0;
+       char *winbindd_priv_socket_dir = NULL;
+       size_t winbindd_priv_socket_dir_len = 0;
 
        setproctitle_init(argc, discard_const(argv), environ);
 
@@ -1835,6 +1837,32 @@ int main(int argc, const char **argv)
                exit(1);
        }
 
+       winbindd_priv_socket_dir = get_winbind_priv_pipe_dir();
+       winbindd_priv_socket_dir_len = strlen(winbindd_priv_socket_dir);
+       if (winbindd_priv_socket_dir_len > 0) {
+               size_t winbindd_priv_socket_len =
+                       winbindd_priv_socket_dir_len + 1 +
+                       strlen(WINBINDD_SOCKET_NAME);
+               struct sockaddr_un un = {
+                       .sun_family = AF_UNIX,
+               };
+               size_t sun_path_len = sizeof(un.sun_path);
+
+               if (winbindd_priv_socket_len >= sun_path_len) {
+                       DBG_ERR("The winbind priviliged socket path [%s/%s] is too long "
+                               "(%zu >= %zu)\n",
+                               winbindd_priv_socket_dir,
+                               WINBINDD_SOCKET_NAME,
+                               winbindd_priv_socket_len,
+                               sun_path_len);
+                       exit(1);
+               }
+       } else {
+               DBG_ERR("'winbindd_priv_socket_directory' parameter is empty\n");
+               exit(1);
+       }
+       TALLOC_FREE(winbindd_priv_socket_dir);
+
        if (!cluster_probe_ok()) {
                exit(1);
        }