Since AB has been changing the winbind interface it's time to add the "mock
authorTim Potter <tpot@samba.org>
Thu, 10 Jan 2002 23:45:29 +0000 (23:45 +0000)
committerTim Potter <tpot@samba.org>
Thu, 10 Jan 2002 23:45:29 +0000 (23:45 +0000)
swedish" test to client calls.  This is putting a length field at the
start of a request so we can disconnect clients talking with an out of date
libnss_winbind.so rather than deadlock them.

Misc cleanups:

 - made some int values uint32
 - moved WINBIND_INTERFACE_VERSION to start of cmd list
(This used to be commit a4af65b9b93671f13f277d49279a85042a8fd1d5)

source3/nsswitch/wb_common.c
source3/nsswitch/winbindd.c
source3/nsswitch/winbindd_nss.h

index d3feaeb4504bea07920cd17e880724f71d4b6468..58b18ec45899d6c070647d718f32f993193df296 100644 (file)
@@ -58,6 +58,8 @@ void init_request(struct winbindd_request *request, int request_type)
         static char *domain_env;
         static BOOL initialised;
 
+       request->length = sizeof(struct winbindd_request);
+
        request->cmd = (enum winbindd_cmd)request_type;
        request->pid = getpid();
        request->domain[0] = '\0';
index 0cbdb340332f0fe1c949f7e3eed9e1112bad7808..01cd0eb55df57b163feb9c042e2a9d533509db19 100644 (file)
@@ -463,12 +463,14 @@ static void client_read(struct winbindd_cli_state *state)
        /* Read data */
 
        do {
-               n = read(state->sock, state->read_buf_len + (char *)&state->request, 
-                                sizeof(state->request) - state->read_buf_len);
+
+               n = read(state->sock, state->read_buf_len + 
+                        (char *)&state->request, 
+                        sizeof(state->request) - state->read_buf_len);
+
        } while (n == -1 && errno == EINTR);
        
-       DEBUG(10,("client_read: read %d bytes. Need %d more for a full request.\n", n,
-                       sizeof(state->request) - n - state->read_buf_len ));
+       DEBUG(10,("client_read: read %d bytes. Need %d more for a full request.\n", n, sizeof(state->request) - n - state->read_buf_len ));
 
        /* Read failed, kill client */
        
@@ -664,8 +666,6 @@ static void process_loop(int accept_sock)
                     
                                        client_read(state);
 
-#if 0
-                                       /* JRA - currently there's no length field in the request... */
                                        /* 
                                         * If we have the start of a
                                         * packet, then check the
@@ -674,19 +674,14 @@ static void process_loop(int accept_sock)
                                         * Mock Swedish.
                                         */
 
-                                       if (state->read_buf_len >= sizeof(int)
-                                           && *(int *) state->buf != sizeof(state->request)) {
-
-                                               struct winbindd_cli_state *rem_state = state;
-
+                                       if (state->read_buf_len >= sizeof(uint32)
+                                           && *(uint32 *) &state->request != sizeof(state->request)) {
                                                DEBUG(0,("process_loop: Invalid request size (%d) send, should be (%d)\n",
-                                                               *(int *) rem_state->buf, sizeof(rem_state->request) ));
+                                                               *(uint32 *) &state->request, sizeof(state->request)));
 
-                                               state = state_next;
-                                               remove_client(rem_state);
-                                               continue;
+                                               remove_client(state);
+                                               break;
                                        }
-#endif
 
                                        /* A request packet might be 
                                           complete */
index bac07fc42d04c0584924153388887973f0e42c32..a88b1209abfd38d407e5afe815d771f225971489 100644 (file)
 #define WINBINDD_DOMAIN_ENV  "WINBINDD_DOMAIN" /* Environment variables */
 #define WINBINDD_DONT_ENV    "_NO_WINBINDD"
 
-/* Socket commands */
-
 /* Update this when you change the interface.  */
-#define WINBIND_INTERFACE_VERSION 1
+
+#define WINBIND_INTERFACE_VERSION 2
+
+/* Socket commands */
 
 enum winbindd_cmd {
 
+       WINBINDD_INTERFACE_VERSION,    /* Always a well known value */
+
        /* Get users and groups */
 
        WINBINDD_GETPWNAM,
@@ -88,7 +91,6 @@ enum winbindd_cmd {
        WINBINDD_CHECK_MACHACC,     /* Check machine account pw works */
        WINBINDD_PING,              /* Just tell me winbind is running */
        WINBINDD_INFO,              /* Various bit of info.  Currently just tidbits */
-       WINBINDD_INTERFACE_VERSION, /* *TRY* to keep this in the same place... */
 
        /* Placeholder for end of cmd list */
 
@@ -98,6 +100,7 @@ enum winbindd_cmd {
 /* Winbind request structure */
 
 struct winbindd_request {
+       uint32 length;
        enum winbindd_cmd cmd;   /* Winbindd command to execute */
        pid_t pid;               /* pid of calling process */
 
@@ -144,7 +147,7 @@ struct winbindd_response {
     
        /* Header information */
 
-       int length;                           /* Length of response */
+       uint32 length;                        /* Length of response */
        enum winbindd_result result;          /* Result code */
 
        /* Fixed length return data */