Buffer overflow of string buffer due to non null terminated string.
Use strlcpy() when it's justifiable.
Use sizeof(var) instead of constants.
Signed-off-by: Dmitry Eremin <dmitry.eremin@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4629
Reviewed-on: http://review.whamcloud.com/9389
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 
                net->ksnn_interfaces[j].ksni_ipaddr = ip;
                net->ksnn_interfaces[j].ksni_netmask = mask;
-               strncpy(&net->ksnn_interfaces[j].ksni_name[0],
-                       names[i], IFNAMSIZ);
+               strlcpy(net->ksnn_interfaces[j].ksni_name,
+                       names[i], sizeof(net->ksnn_interfaces[j].ksni_name));
                j++;
        }
 
                                goto fail_1;
                        }
 
-                       strncpy(&net->ksnn_interfaces[i].ksni_name[0],
-                               ni->ni_interfaces[i], IFNAMSIZ);
+                       strlcpy(net->ksnn_interfaces[i].ksni_name,
+                               ni->ni_interfaces[i],
+                               sizeof(net->ksnn_interfaces[i].ksni_name));
                }
                net->ksnn_ninterfaces = i;
        }
 
        INIT_LIST_HEAD(&nets);
 
        /* save a copy of the string for error messages */
-       strncpy(cmd, str, sizeof(cmd) - 1);
-       cmd[sizeof(cmd) - 1] = 0;
+       strncpy(cmd, str, sizeof(cmd));
+       cmd[sizeof(cmd) - 1] = '\0';
 
        sep = str;
        for (;;) {
                        return 0;
 
                offset += (int)(sep - tb->ltb_text);
-               tb2 = lnet_new_text_buf(strlen(sep));
+               len = strlen(sep);
+               tb2 = lnet_new_text_buf(len);
                if (tb2 == NULL)
                        return -ENOMEM;
 
-               strcpy(tb2->ltb_text, sep);
+               strncpy(tb2->ltb_text, sep, len);
+               tb2->ltb_text[len] = '\0';
                list_add_tail(&tb2->ltb_list, nets);
 
                tb = tb2;
                tb = list_entry(raw_entries.next, struct lnet_text_buf_t,
                                    ltb_list);
 
-               strncpy(source, tb->ltb_text, sizeof(source)-1);
-               source[sizeof(source)-1] = 0;
+               strncpy(source, tb->ltb_text, sizeof(source));
+               source[sizeof(source)-1] = '\0';
 
                /* replace ltb_text with the network(s) add on match */
                rc = lnet_match_network_tokens(tb->ltb_text, ipaddrs, nip);
 
                msrq = &(*crpc)->crp_rpc->crpc_reqstmsg.msg_body.mksn_reqst;
                msrq->mksn_sid     = console_session.ses_id;
                msrq->mksn_force   = console_session.ses_force;
-               strncpy(msrq->mksn_name, console_session.ses_name,
-                       strlen(console_session.ses_name));
+               strlcpy(msrq->mksn_name, console_session.ses_name,
+                       sizeof(msrq->mksn_name));
                break;
 
        case LST_TRANS_SESEND:
 
        console_session.ses_feats_updated = 0;
        console_session.ses_timeout = (timeout <= 0) ?
                                      LST_CONSOLE_TIMEOUT : timeout;
-       strcpy(console_session.ses_name, name);
+       strlcpy(console_session.ses_name, name,
+               sizeof(console_session.ses_name));
 
        rc = lstcon_batch_add(LST_DEFAULT_BATCH);
        if (rc != 0)
        if (grp->grp_userland == 0)
                grp->grp_userland = 1;
 
-       strcpy(jrep->join_session, console_session.ses_name);
+       strlcpy(jrep->join_session, console_session.ses_name,
+               sizeof(jrep->join_session));
        jrep->join_timeout = console_session.ses_timeout;
        jrep->join_status  = 0;
 
 
    everything as string options */
 
 #define LMD_MAGIC    0xbdacbd03
+#define LMD_PARAMS_MAXLEN      4096
 
 /* gleaned from the mount command - no persistent info here */
 struct lustre_mount_data {
 
        }
 
        if (libcfs_debug_file_path != NULL) {
-               strncpy(libcfs_debug_file_path_arr,
-                       libcfs_debug_file_path, PATH_MAX-1);
-               libcfs_debug_file_path_arr[PATH_MAX - 1] = '\0';
+               strlcpy(libcfs_debug_file_path_arr,
+                       libcfs_debug_file_path,
+                       sizeof(libcfs_debug_file_path_arr));
        }
 
        /* If libcfs_debug_mb is set to an invalid value or uninitialized
 
        if (hs == NULL)
                return NULL;
 
-       strncpy(hs->hs_name, name, len);
-       hs->hs_name[len - 1] = '\0';
+       strlcpy(hs->hs_name, name, len);
        hs->hs_flags = flags;
 
        atomic_set(&hs->hs_refcount, 1);
 
        if (sched == NULL)
                return -ENOMEM;
 
-       strncpy(sched->ws_name, name, CFS_WS_NAME_LEN);
-       sched->ws_name[CFS_WS_NAME_LEN - 1] = '\0';
+       strlcpy(sched->ws_name, name, CFS_WS_NAME_LEN);
+
        sched->ws_cptab = cptab;
        sched->ws_cpt = cpt;
 
 
        if (!msp)
                return -ENOMEM;
 
-       strncpy(msp->mgs_param, string, MGS_PARAM_MAXLEN);
+       strlcpy(msp->mgs_param, string, sizeof(msp->mgs_param));
        rc = obd_set_info_async(NULL, mgc, sizeof(KEY_SET_INFO), KEY_SET_INFO,
                                sizeof(struct mgs_send_param), msp, NULL);
        if (rc)
 
        if (!new_pool)
                return -ENOMEM;
 
-       strncpy(new_pool->pool_name, poolname, LOV_MAXPOOLNAME);
-       new_pool->pool_name[LOV_MAXPOOLNAME] = '\0';
+       strlcpy(new_pool->pool_name, poolname, sizeof(new_pool->pool_name));
        new_pool->pool_lobd = obd;
        /* ref count init to 1 because when created a pool is always used
         * up to deletion
 
        }
        lmd->lmd_magic = LMD_MAGIC;
 
-       lmd->lmd_params = kzalloc(4096, GFP_NOFS);
+       lmd->lmd_params = kzalloc(LMD_PARAMS_MAXLEN, GFP_NOFS);
        if (!lmd->lmd_params)
                return -ENOMEM;
        lmd->lmd_params[0] = '\0';
                                goto invalid;
                        clear++;
                } else if (strncmp(s1, "param=", 6) == 0) {
-                       int length;
+                       size_t length, params_length;
                        char *tail = strchr(s1 + 6, ',');
 
                        if (tail == NULL)
                        else
                                length = tail - s1;
                        length -= 6;
+                       params_length = strlen(lmd->lmd_params);
+                       if (params_length + length + 1 >= LMD_PARAMS_MAXLEN)
+                               return -E2BIG;
                        strncat(lmd->lmd_params, s1 + 6, length);
-                       strcat(lmd->lmd_params, " ");
+                       lmd->lmd_params[params_length + length] = '\0';
+                       strlcat(lmd->lmd_params, " ", LMD_PARAMS_MAXLEN);
                        clear++;
                } else if (strncmp(s1, "osd=", 4) == 0) {
                        rc = lmd_parse_string(&lmd->lmd_osd_type, s1 + 4);
 
        complete(&pc->pc_starting);
 
        /*
+
         * This mainloop strongly resembles ptlrpc_set_wait() except that our
         * set never completes.  ptlrpcd_check() calls ptlrpc_check_set() when
         * there are requests in the set. New requests come in on the set's
 
                return 0;
        }
 
-       strncpy(buf, str, sizeof(buf));
-       buf[sizeof(buf) - 1] = '\0';
+       strlcpy(buf, str, sizeof(buf));
 
        bulk = strchr(buf, '-');
        if (bulk)