@@ -2349,8 +2349,10 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
2349
2349
struct ipvs_sync_daemon_cfg cfg ;
2350
2350
2351
2351
memset (& cfg , 0 , sizeof (cfg ));
2352
- strlcpy (cfg .mcast_ifn , dm -> mcast_ifn ,
2353
- sizeof (cfg .mcast_ifn ));
2352
+ ret = - EINVAL ;
2353
+ if (strscpy (cfg .mcast_ifn , dm -> mcast_ifn ,
2354
+ sizeof (cfg .mcast_ifn )) <= 0 )
2355
+ goto out_dec ;
2354
2356
cfg .syncid = dm -> syncid ;
2355
2357
ret = start_sync_thread (ipvs , & cfg , dm -> state );
2356
2358
} else {
@@ -2388,12 +2390,19 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
2388
2390
}
2389
2391
}
2390
2392
2393
+ if ((cmd == IP_VS_SO_SET_ADD || cmd == IP_VS_SO_SET_EDIT ) &&
2394
+ strnlen (usvc .sched_name , IP_VS_SCHEDNAME_MAXLEN ) ==
2395
+ IP_VS_SCHEDNAME_MAXLEN ) {
2396
+ ret = - EINVAL ;
2397
+ goto out_unlock ;
2398
+ }
2399
+
2391
2400
/* Check for valid protocol: TCP or UDP or SCTP, even for fwmark!=0 */
2392
2401
if (usvc .protocol != IPPROTO_TCP && usvc .protocol != IPPROTO_UDP &&
2393
2402
usvc .protocol != IPPROTO_SCTP ) {
2394
- pr_err ("set_ctl: invalid protocol: %d %pI4:%d %s \n" ,
2403
+ pr_err ("set_ctl: invalid protocol: %d %pI4:%d\n" ,
2395
2404
usvc .protocol , & usvc .addr .ip ,
2396
- ntohs (usvc .port ), usvc . sched_name );
2405
+ ntohs (usvc .port ));
2397
2406
ret = - EFAULT ;
2398
2407
goto out_unlock ;
2399
2408
}
@@ -2822,7 +2831,7 @@ static const struct nla_policy ip_vs_cmd_policy[IPVS_CMD_ATTR_MAX + 1] = {
2822
2831
static const struct nla_policy ip_vs_daemon_policy [IPVS_DAEMON_ATTR_MAX + 1 ] = {
2823
2832
[IPVS_DAEMON_ATTR_STATE ] = { .type = NLA_U32 },
2824
2833
[IPVS_DAEMON_ATTR_MCAST_IFN ] = { .type = NLA_NUL_STRING ,
2825
- .len = IP_VS_IFNAME_MAXLEN },
2834
+ .len = IP_VS_IFNAME_MAXLEN - 1 },
2826
2835
[IPVS_DAEMON_ATTR_SYNC_ID ] = { .type = NLA_U32 },
2827
2836
[IPVS_DAEMON_ATTR_SYNC_MAXLEN ] = { .type = NLA_U16 },
2828
2837
[IPVS_DAEMON_ATTR_MCAST_GROUP ] = { .type = NLA_U32 },
@@ -2840,7 +2849,7 @@ static const struct nla_policy ip_vs_svc_policy[IPVS_SVC_ATTR_MAX + 1] = {
2840
2849
[IPVS_SVC_ATTR_PORT ] = { .type = NLA_U16 },
2841
2850
[IPVS_SVC_ATTR_FWMARK ] = { .type = NLA_U32 },
2842
2851
[IPVS_SVC_ATTR_SCHED_NAME ] = { .type = NLA_NUL_STRING ,
2843
- .len = IP_VS_SCHEDNAME_MAXLEN },
2852
+ .len = IP_VS_SCHEDNAME_MAXLEN - 1 },
2844
2853
[IPVS_SVC_ATTR_PE_NAME ] = { .type = NLA_NUL_STRING ,
2845
2854
.len = IP_VS_PENAME_MAXLEN },
2846
2855
[IPVS_SVC_ATTR_FLAGS ] = { .type = NLA_BINARY ,
0 commit comments