Commit 9563fe8a authored by Dmitry Eremin's avatar Dmitry Eremin Committed by Greg Kroah-Hartman

staging: lustre: fix buffer overflow of string buffer

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: default avatarDmitry Eremin <dmitry.eremin@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4629
Reviewed-on: http://review.whamcloud.com/9389Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 30a0a431
...@@ -2621,8 +2621,8 @@ ksocknal_enumerate_interfaces(ksock_net_t *net) ...@@ -2621,8 +2621,8 @@ ksocknal_enumerate_interfaces(ksock_net_t *net)
net->ksnn_interfaces[j].ksni_ipaddr = ip; net->ksnn_interfaces[j].ksni_ipaddr = ip;
net->ksnn_interfaces[j].ksni_netmask = mask; net->ksnn_interfaces[j].ksni_netmask = mask;
strncpy(&net->ksnn_interfaces[j].ksni_name[0], strlcpy(net->ksnn_interfaces[j].ksni_name,
names[i], IFNAMSIZ); names[i], sizeof(net->ksnn_interfaces[j].ksni_name));
j++; j++;
} }
...@@ -2805,8 +2805,9 @@ ksocknal_startup(lnet_ni_t *ni) ...@@ -2805,8 +2805,9 @@ ksocknal_startup(lnet_ni_t *ni)
goto fail_1; goto fail_1;
} }
strncpy(&net->ksnn_interfaces[i].ksni_name[0], strlcpy(net->ksnn_interfaces[i].ksni_name,
ni->ni_interfaces[i], IFNAMSIZ); ni->ni_interfaces[i],
sizeof(net->ksnn_interfaces[i].ksni_name));
} }
net->ksnn_ninterfaces = i; net->ksnn_ninterfaces = i;
} }
......
...@@ -650,8 +650,8 @@ lnet_parse_route(char *str, int *im_a_router) ...@@ -650,8 +650,8 @@ lnet_parse_route(char *str, int *im_a_router)
INIT_LIST_HEAD(&nets); INIT_LIST_HEAD(&nets);
/* save a copy of the string for error messages */ /* save a copy of the string for error messages */
strncpy(cmd, str, sizeof(cmd) - 1); strncpy(cmd, str, sizeof(cmd));
cmd[sizeof(cmd) - 1] = 0; cmd[sizeof(cmd) - 1] = '\0';
sep = str; sep = str;
for (;;) { for (;;) {
...@@ -972,11 +972,13 @@ lnet_splitnets(char *source, struct list_head *nets) ...@@ -972,11 +972,13 @@ lnet_splitnets(char *source, struct list_head *nets)
return 0; return 0;
offset += (int)(sep - tb->ltb_text); 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) if (tb2 == NULL)
return -ENOMEM; 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); list_add_tail(&tb2->ltb_list, nets);
tb = tb2; tb = tb2;
...@@ -1021,8 +1023,8 @@ lnet_match_networks(char **networksp, char *ip2nets, __u32 *ipaddrs, int nip) ...@@ -1021,8 +1023,8 @@ lnet_match_networks(char **networksp, char *ip2nets, __u32 *ipaddrs, int nip)
tb = list_entry(raw_entries.next, struct lnet_text_buf_t, tb = list_entry(raw_entries.next, struct lnet_text_buf_t,
ltb_list); ltb_list);
strncpy(source, tb->ltb_text, sizeof(source)-1); strncpy(source, tb->ltb_text, sizeof(source));
source[sizeof(source)-1] = 0; source[sizeof(source)-1] = '\0';
/* replace ltb_text with the network(s) add on match */ /* replace ltb_text with the network(s) add on match */
rc = lnet_match_network_tokens(tb->ltb_text, ipaddrs, nip); rc = lnet_match_network_tokens(tb->ltb_text, ipaddrs, nip);
......
...@@ -612,8 +612,8 @@ lstcon_sesrpc_prep(lstcon_node_t *nd, int transop, ...@@ -612,8 +612,8 @@ lstcon_sesrpc_prep(lstcon_node_t *nd, int transop,
msrq = &(*crpc)->crp_rpc->crpc_reqstmsg.msg_body.mksn_reqst; msrq = &(*crpc)->crp_rpc->crpc_reqstmsg.msg_body.mksn_reqst;
msrq->mksn_sid = console_session.ses_id; msrq->mksn_sid = console_session.ses_id;
msrq->mksn_force = console_session.ses_force; msrq->mksn_force = console_session.ses_force;
strncpy(msrq->mksn_name, console_session.ses_name, strlcpy(msrq->mksn_name, console_session.ses_name,
strlen(console_session.ses_name)); sizeof(msrq->mksn_name));
break; break;
case LST_TRANS_SESEND: case LST_TRANS_SESEND:
......
...@@ -1731,7 +1731,8 @@ lstcon_session_new(char *name, int key, unsigned feats, ...@@ -1731,7 +1731,8 @@ lstcon_session_new(char *name, int key, unsigned feats,
console_session.ses_feats_updated = 0; console_session.ses_feats_updated = 0;
console_session.ses_timeout = (timeout <= 0) ? console_session.ses_timeout = (timeout <= 0) ?
LST_CONSOLE_TIMEOUT : timeout; 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); rc = lstcon_batch_add(LST_DEFAULT_BATCH);
if (rc != 0) if (rc != 0)
...@@ -1951,7 +1952,8 @@ lstcon_acceptor_handle(struct srpc_server_rpc *rpc) ...@@ -1951,7 +1952,8 @@ lstcon_acceptor_handle(struct srpc_server_rpc *rpc)
if (grp->grp_userland == 0) if (grp->grp_userland == 0)
grp->grp_userland = 1; 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_timeout = console_session.ses_timeout;
jrep->join_status = 0; jrep->join_status = 0;
......
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
everything as string options */ everything as string options */
#define LMD_MAGIC 0xbdacbd03 #define LMD_MAGIC 0xbdacbd03
#define LMD_PARAMS_MAXLEN 4096
/* gleaned from the mount command - no persistent info here */ /* gleaned from the mount command - no persistent info here */
struct lustre_mount_data { struct lustre_mount_data {
......
...@@ -504,9 +504,9 @@ int libcfs_debug_init(unsigned long bufsize) ...@@ -504,9 +504,9 @@ int libcfs_debug_init(unsigned long bufsize)
} }
if (libcfs_debug_file_path != NULL) { if (libcfs_debug_file_path != NULL) {
strncpy(libcfs_debug_file_path_arr, strlcpy(libcfs_debug_file_path_arr,
libcfs_debug_file_path, PATH_MAX-1); libcfs_debug_file_path,
libcfs_debug_file_path_arr[PATH_MAX - 1] = '\0'; sizeof(libcfs_debug_file_path_arr));
} }
/* If libcfs_debug_mb is set to an invalid value or uninitialized /* If libcfs_debug_mb is set to an invalid value or uninitialized
......
...@@ -1037,8 +1037,7 @@ cfs_hash_create(char *name, unsigned cur_bits, unsigned max_bits, ...@@ -1037,8 +1037,7 @@ cfs_hash_create(char *name, unsigned cur_bits, unsigned max_bits,
if (hs == NULL) if (hs == NULL)
return NULL; return NULL;
strncpy(hs->hs_name, name, len); strlcpy(hs->hs_name, name, len);
hs->hs_name[len - 1] = '\0';
hs->hs_flags = flags; hs->hs_flags = flags;
atomic_set(&hs->hs_refcount, 1); atomic_set(&hs->hs_refcount, 1);
......
...@@ -360,8 +360,8 @@ cfs_wi_sched_create(char *name, struct cfs_cpt_table *cptab, ...@@ -360,8 +360,8 @@ cfs_wi_sched_create(char *name, struct cfs_cpt_table *cptab,
if (sched == NULL) if (sched == NULL)
return -ENOMEM; return -ENOMEM;
strncpy(sched->ws_name, name, CFS_WS_NAME_LEN); strlcpy(sched->ws_name, name, CFS_WS_NAME_LEN);
sched->ws_name[CFS_WS_NAME_LEN - 1] = '\0';
sched->ws_cptab = cptab; sched->ws_cptab = cptab;
sched->ws_cpt = cpt; sched->ws_cpt = cpt;
......
...@@ -641,7 +641,7 @@ static int ll_send_mgc_param(struct obd_export *mgc, char *string) ...@@ -641,7 +641,7 @@ static int ll_send_mgc_param(struct obd_export *mgc, char *string)
if (!msp) if (!msp)
return -ENOMEM; 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, rc = obd_set_info_async(NULL, mgc, sizeof(KEY_SET_INFO), KEY_SET_INFO,
sizeof(struct mgs_send_param), msp, NULL); sizeof(struct mgs_send_param), msp, NULL);
if (rc) if (rc)
......
...@@ -412,8 +412,7 @@ int lov_pool_new(struct obd_device *obd, char *poolname) ...@@ -412,8 +412,7 @@ int lov_pool_new(struct obd_device *obd, char *poolname)
if (!new_pool) if (!new_pool)
return -ENOMEM; return -ENOMEM;
strncpy(new_pool->pool_name, poolname, LOV_MAXPOOLNAME); strlcpy(new_pool->pool_name, poolname, sizeof(new_pool->pool_name));
new_pool->pool_name[LOV_MAXPOOLNAME] = '\0';
new_pool->pool_lobd = obd; new_pool->pool_lobd = obd;
/* ref count init to 1 because when created a pool is always used /* ref count init to 1 because when created a pool is always used
* up to deletion * up to deletion
......
...@@ -892,7 +892,7 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd) ...@@ -892,7 +892,7 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd)
} }
lmd->lmd_magic = LMD_MAGIC; 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) if (!lmd->lmd_params)
return -ENOMEM; return -ENOMEM;
lmd->lmd_params[0] = '\0'; lmd->lmd_params[0] = '\0';
...@@ -978,7 +978,7 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd) ...@@ -978,7 +978,7 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd)
goto invalid; goto invalid;
clear++; clear++;
} else if (strncmp(s1, "param=", 6) == 0) { } else if (strncmp(s1, "param=", 6) == 0) {
int length; size_t length, params_length;
char *tail = strchr(s1 + 6, ','); char *tail = strchr(s1 + 6, ',');
if (tail == NULL) if (tail == NULL)
...@@ -986,8 +986,12 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd) ...@@ -986,8 +986,12 @@ static int lmd_parse(char *options, struct lustre_mount_data *lmd)
else else
length = tail - s1; length = tail - s1;
length -= 6; 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); 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++; clear++;
} else if (strncmp(s1, "osd=", 4) == 0) { } else if (strncmp(s1, "osd=", 4) == 0) {
rc = lmd_parse_string(&lmd->lmd_osd_type, s1 + 4); rc = lmd_parse_string(&lmd->lmd_osd_type, s1 + 4);
......
...@@ -422,6 +422,7 @@ static int ptlrpcd(void *arg) ...@@ -422,6 +422,7 @@ static int ptlrpcd(void *arg)
complete(&pc->pc_starting); complete(&pc->pc_starting);
/* /*
* This mainloop strongly resembles ptlrpc_set_wait() except that our * This mainloop strongly resembles ptlrpc_set_wait() except that our
* set never completes. ptlrpcd_check() calls ptlrpc_check_set() when * set never completes. ptlrpcd_check() calls ptlrpc_check_set() when
* there are requests in the set. New requests come in on the set's * there are requests in the set. New requests come in on the set's
......
...@@ -83,8 +83,7 @@ int sptlrpc_parse_flavor(const char *str, struct sptlrpc_flavor *flvr) ...@@ -83,8 +83,7 @@ int sptlrpc_parse_flavor(const char *str, struct sptlrpc_flavor *flvr)
return 0; return 0;
} }
strncpy(buf, str, sizeof(buf)); strlcpy(buf, str, sizeof(buf));
buf[sizeof(buf) - 1] = '\0';
bulk = strchr(buf, '-'); bulk = strchr(buf, '-');
if (bulk) if (bulk)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment