Whamcloud - gitweb
Branch b_release_1_4_6
authoradilger <adilger>
Mon, 6 Feb 2006 20:22:45 +0000 (20:22 +0000)
committeradilger <adilger>
Mon, 6 Feb 2006 20:22:45 +0000 (20:22 +0000)
Don't dereference data=NULL in case of old liblustre client connections.
b=8007

lustre/ldlm/ldlm_lib.c

index 0bb67db..c98693a 100644 (file)
@@ -588,17 +588,26 @@ int target_handle_connect(struct ptlrpc_request *req, svc_handler_t handler)
                 GOTO(out, rc);
 
         if (lustre_msg_get_op_flags(req->rq_reqmsg) & MSG_CONNECT_LIBCLIENT) {
-                if (!data || (data->ocd_version < LUSTRE_VERSION_CODE -
-                               LUSTRE_VERSION_ALLOWED_OFFSET)) {
+                if (!data) {
+                        DEBUG_REQ(D_INFO, req, "Refusing old (unversioned) "
+                                  "libclient connection attempt\n");
+                        GOTO(out, rc = -EPROTO);
+                } else if (data->ocd_version < LUSTRE_VERSION_CODE -
+                                               LUSTRE_VERSION_ALLOWED_OFFSET) {
                         DEBUG_REQ(D_INFO, req, "Refusing old (%d.%d.%d.%d) "
                                   "libclient connection attempt\n",
                                   OBD_OCD_VERSION_MAJOR(data->ocd_version),
                                   OBD_OCD_VERSION_MINOR(data->ocd_version),
                                   OBD_OCD_VERSION_PATCH(data->ocd_version),
                                   OBD_OCD_VERSION_FIX(data->ocd_version));
-                        data = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*data));
-                        data->ocd_connect_flags = OBD_CONNECT_VERSION;
-                        data->ocd_version = LUSTRE_VERSION_CODE;
+                        data = lustre_msg_buf(req->rq_repmsg, 0,
+                                              offsetof(typeof(*data),
+                                                       ocd_version) +
+                                              sizeof(data->ocd_version));
+                        if (data) {
+                                data->ocd_connect_flags = OBD_CONNECT_VERSION;
+                                data->ocd_version = LUSTRE_VERSION_CODE;
+                        }
                         GOTO(out, rc = -EPROTO);
                 }
         }