s3:winbindd: Add a check for the path length of 'winbindd socket directory'
authorAndreas Schneider <asn@samba.org>
Tue, 3 Aug 2021 09:04:37 +0000 (11:04 +0200)
committerJule Anger <janger@samba.org>
Fri, 6 Aug 2021 14:49:17 +0000 (14:49 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14779

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
(cherry picked from commit aab5cc95e224fef0efafeb1c37a4eb414aee65a0)

source3/winbindd/winbindd.c

index 4f367d07ecbbcfc86d2267f29fb5505fadaea5df..89e62b43ca05d0ddae87485519b1a3d55ca3b135 100644 (file)
@@ -1658,6 +1658,7 @@ int main(int argc, const char **argv)
        bool ok;
        const struct dcesrv_endpoint_server *ep_server = NULL;
        struct dcesrv_context *dce_ctx = NULL;
+       size_t winbindd_socket_dir_len = 0;
 
        setproctitle_init(argc, discard_const(argv), environ);
 
@@ -1810,6 +1811,30 @@ int main(int argc, const char **argv)
                }
        }
 
+       winbindd_socket_dir_len = strlen(lp_winbindd_socket_directory());
+       if (winbindd_socket_dir_len > 0) {
+               size_t winbindd_socket_len =
+                       winbindd_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_socket_len >= sun_path_len) {
+                       DBG_ERR("The winbind socket path [%s/%s] is too long "
+                               "(%zu >= %zu)\n",
+                               lp_winbindd_socket_directory(),
+                               WINBINDD_SOCKET_NAME,
+                               winbindd_socket_dir_len,
+                               sun_path_len);
+                       exit(1);
+               }
+       } else {
+               DBG_ERR("'winbindd_socket_directory' parameter is empty\n");
+               exit(1);
+       }
+
        if (!cluster_probe_ok()) {
                exit(1);
        }