@@ -2381,8 +2381,10 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
2381
2381
struct ipvs_sync_daemon_cfg cfg ;
2382
2382
2383
2383
memset (& cfg , 0 , sizeof (cfg ));
2384
- strlcpy (cfg .mcast_ifn , dm -> mcast_ifn ,
2385
- sizeof (cfg .mcast_ifn ));
2384
+ ret = - EINVAL ;
2385
+ if (strscpy (cfg .mcast_ifn , dm -> mcast_ifn ,
2386
+ sizeof (cfg .mcast_ifn )) <= 0 )
2387
+ goto out_dec ;
2386
2388
cfg .syncid = dm -> syncid ;
2387
2389
ret = start_sync_thread (ipvs , & cfg , dm -> state );
2388
2390
} else {
@@ -2420,12 +2422,19 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
2420
2422
}
2421
2423
}
2422
2424
2425
+ if ((cmd == IP_VS_SO_SET_ADD || cmd == IP_VS_SO_SET_EDIT ) &&
2426
+ strnlen (usvc .sched_name , IP_VS_SCHEDNAME_MAXLEN ) ==
2427
+ IP_VS_SCHEDNAME_MAXLEN ) {
2428
+ ret = - EINVAL ;
2429
+ goto out_unlock ;
2430
+ }
2431
+
2423
2432
/* Check for valid protocol: TCP or UDP or SCTP, even for fwmark!=0 */
2424
2433
if (usvc .protocol != IPPROTO_TCP && usvc .protocol != IPPROTO_UDP &&
2425
2434
usvc .protocol != IPPROTO_SCTP ) {
2426
- pr_err ("set_ctl: invalid protocol: %d %pI4:%d %s \n" ,
2435
+ pr_err ("set_ctl: invalid protocol: %d %pI4:%d\n" ,
2427
2436
usvc .protocol , & usvc .addr .ip ,
2428
- ntohs (usvc .port ), usvc . sched_name );
2437
+ ntohs (usvc .port ));
2429
2438
ret = - EFAULT ;
2430
2439
goto out_unlock ;
2431
2440
}
@@ -2847,7 +2856,7 @@ static const struct nla_policy ip_vs_cmd_policy[IPVS_CMD_ATTR_MAX + 1] = {
2847
2856
static const struct nla_policy ip_vs_daemon_policy [IPVS_DAEMON_ATTR_MAX + 1 ] = {
2848
2857
[IPVS_DAEMON_ATTR_STATE ] = { .type = NLA_U32 },
2849
2858
[IPVS_DAEMON_ATTR_MCAST_IFN ] = { .type = NLA_NUL_STRING ,
2850
- .len = IP_VS_IFNAME_MAXLEN },
2859
+ .len = IP_VS_IFNAME_MAXLEN - 1 },
2851
2860
[IPVS_DAEMON_ATTR_SYNC_ID ] = { .type = NLA_U32 },
2852
2861
[IPVS_DAEMON_ATTR_SYNC_MAXLEN ] = { .type = NLA_U16 },
2853
2862
[IPVS_DAEMON_ATTR_MCAST_GROUP ] = { .type = NLA_U32 },
@@ -2865,7 +2874,7 @@ static const struct nla_policy ip_vs_svc_policy[IPVS_SVC_ATTR_MAX + 1] = {
2865
2874
[IPVS_SVC_ATTR_PORT ] = { .type = NLA_U16 },
2866
2875
[IPVS_SVC_ATTR_FWMARK ] = { .type = NLA_U32 },
2867
2876
[IPVS_SVC_ATTR_SCHED_NAME ] = { .type = NLA_NUL_STRING ,
2868
- .len = IP_VS_SCHEDNAME_MAXLEN },
2877
+ .len = IP_VS_SCHEDNAME_MAXLEN - 1 },
2869
2878
[IPVS_SVC_ATTR_PE_NAME ] = { .type = NLA_NUL_STRING ,
2870
2879
.len = IP_VS_PENAME_MAXLEN },
2871
2880
[IPVS_SVC_ATTR_FLAGS ] = { .type = NLA_BINARY ,
0 commit comments