diff options
author | David S. Miller <davem@davemloft.net> | 2012-04-01 19:03:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-02 04:33:41 -0400 |
commit | 969e8e255c0a18c30cf78feca2d2e546b5746fc4 (patch) | |
tree | 309f3674ec0dfc87479cdb039654d9c6a0a20689 /net | |
parent | bae65be896cc420f58460cb6f6ac03e71d1bf240 (diff) |
ipvs: Stop using NLA_PUT*().
These macros contain a hidden goto, and are thus extremely error
prone and make code hard to audit.
Signed-off-by: David S. Miller <davem@davemloft.net>
Acked-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_ctl.c | 108 |
1 files changed, 58 insertions, 50 deletions
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index b3afe189af61..964d426d237f 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -2816,17 +2816,17 @@ static int ip_vs_genl_fill_stats(struct sk_buff *skb, int container_type, | |||
2816 | 2816 | ||
2817 | ip_vs_copy_stats(&ustats, stats); | 2817 | ip_vs_copy_stats(&ustats, stats); |
2818 | 2818 | ||
2819 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_CONNS, ustats.conns); | 2819 | if (nla_put_u32(skb, IPVS_STATS_ATTR_CONNS, ustats.conns) || |
2820 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_INPKTS, ustats.inpkts); | 2820 | nla_put_u32(skb, IPVS_STATS_ATTR_INPKTS, ustats.inpkts) || |
2821 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_OUTPKTS, ustats.outpkts); | 2821 | nla_put_u32(skb, IPVS_STATS_ATTR_OUTPKTS, ustats.outpkts) || |
2822 | NLA_PUT_U64(skb, IPVS_STATS_ATTR_INBYTES, ustats.inbytes); | 2822 | nla_put_u64(skb, IPVS_STATS_ATTR_INBYTES, ustats.inbytes) || |
2823 | NLA_PUT_U64(skb, IPVS_STATS_ATTR_OUTBYTES, ustats.outbytes); | 2823 | nla_put_u64(skb, IPVS_STATS_ATTR_OUTBYTES, ustats.outbytes) || |
2824 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_CPS, ustats.cps); | 2824 | nla_put_u32(skb, IPVS_STATS_ATTR_CPS, ustats.cps) || |
2825 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_INPPS, ustats.inpps); | 2825 | nla_put_u32(skb, IPVS_STATS_ATTR_INPPS, ustats.inpps) || |
2826 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_OUTPPS, ustats.outpps); | 2826 | nla_put_u32(skb, IPVS_STATS_ATTR_OUTPPS, ustats.outpps) || |
2827 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_INBPS, ustats.inbps); | 2827 | nla_put_u32(skb, IPVS_STATS_ATTR_INBPS, ustats.inbps) || |
2828 | NLA_PUT_U32(skb, IPVS_STATS_ATTR_OUTBPS, ustats.outbps); | 2828 | nla_put_u32(skb, IPVS_STATS_ATTR_OUTBPS, ustats.outbps)) |
2829 | 2829 | goto nla_put_failure; | |
2830 | nla_nest_end(skb, nl_stats); | 2830 | nla_nest_end(skb, nl_stats); |
2831 | 2831 | ||
2832 | return 0; | 2832 | return 0; |
@@ -2847,23 +2847,25 @@ static int ip_vs_genl_fill_service(struct sk_buff *skb, | |||
2847 | if (!nl_service) | 2847 | if (!nl_service) |
2848 | return -EMSGSIZE; | 2848 | return -EMSGSIZE; |
2849 | 2849 | ||
2850 | NLA_PUT_U16(skb, IPVS_SVC_ATTR_AF, svc->af); | 2850 | if (nla_put_u16(skb, IPVS_SVC_ATTR_AF, svc->af)) |
2851 | 2851 | goto nla_put_failure; | |
2852 | if (svc->fwmark) { | 2852 | if (svc->fwmark) { |
2853 | NLA_PUT_U32(skb, IPVS_SVC_ATTR_FWMARK, svc->fwmark); | 2853 | if (nla_put_u32(skb, IPVS_SVC_ATTR_FWMARK, svc->fwmark)) |
2854 | goto nla_put_failure; | ||
2854 | } else { | 2855 | } else { |
2855 | NLA_PUT_U16(skb, IPVS_SVC_ATTR_PROTOCOL, svc->protocol); | 2856 | if (nla_put_u16(skb, IPVS_SVC_ATTR_PROTOCOL, svc->protocol) || |
2856 | NLA_PUT(skb, IPVS_SVC_ATTR_ADDR, sizeof(svc->addr), &svc->addr); | 2857 | nla_put(skb, IPVS_SVC_ATTR_ADDR, sizeof(svc->addr), &svc->addr) || |
2857 | NLA_PUT_U16(skb, IPVS_SVC_ATTR_PORT, svc->port); | 2858 | nla_put_u16(skb, IPVS_SVC_ATTR_PORT, svc->port)) |
2859 | goto nla_put_failure; | ||
2858 | } | 2860 | } |
2859 | 2861 | ||
2860 | NLA_PUT_STRING(skb, IPVS_SVC_ATTR_SCHED_NAME, svc->scheduler->name); | 2862 | if (nla_put_string(skb, IPVS_SVC_ATTR_SCHED_NAME, svc->scheduler->name) || |
2861 | if (svc->pe) | 2863 | (svc->pe && |
2862 | NLA_PUT_STRING(skb, IPVS_SVC_ATTR_PE_NAME, svc->pe->name); | 2864 | nla_put_string(skb, IPVS_SVC_ATTR_PE_NAME, svc->pe->name)) || |
2863 | NLA_PUT(skb, IPVS_SVC_ATTR_FLAGS, sizeof(flags), &flags); | 2865 | nla_put(skb, IPVS_SVC_ATTR_FLAGS, sizeof(flags), &flags) || |
2864 | NLA_PUT_U32(skb, IPVS_SVC_ATTR_TIMEOUT, svc->timeout / HZ); | 2866 | nla_put_u32(skb, IPVS_SVC_ATTR_TIMEOUT, svc->timeout / HZ) || |
2865 | NLA_PUT_U32(skb, IPVS_SVC_ATTR_NETMASK, svc->netmask); | 2867 | nla_put_u32(skb, IPVS_SVC_ATTR_NETMASK, svc->netmask)) |
2866 | 2868 | goto nla_put_failure; | |
2867 | if (ip_vs_genl_fill_stats(skb, IPVS_SVC_ATTR_STATS, &svc->stats)) | 2869 | if (ip_vs_genl_fill_stats(skb, IPVS_SVC_ATTR_STATS, &svc->stats)) |
2868 | goto nla_put_failure; | 2870 | goto nla_put_failure; |
2869 | 2871 | ||
@@ -3038,21 +3040,22 @@ static int ip_vs_genl_fill_dest(struct sk_buff *skb, struct ip_vs_dest *dest) | |||
3038 | if (!nl_dest) | 3040 | if (!nl_dest) |
3039 | return -EMSGSIZE; | 3041 | return -EMSGSIZE; |
3040 | 3042 | ||
3041 | NLA_PUT(skb, IPVS_DEST_ATTR_ADDR, sizeof(dest->addr), &dest->addr); | 3043 | if (nla_put(skb, IPVS_DEST_ATTR_ADDR, sizeof(dest->addr), &dest->addr) || |
3042 | NLA_PUT_U16(skb, IPVS_DEST_ATTR_PORT, dest->port); | 3044 | nla_put_u16(skb, IPVS_DEST_ATTR_PORT, dest->port) || |
3043 | 3045 | nla_put_u32(skb, IPVS_DEST_ATTR_FWD_METHOD, | |
3044 | NLA_PUT_U32(skb, IPVS_DEST_ATTR_FWD_METHOD, | 3046 | (atomic_read(&dest->conn_flags) & |
3045 | atomic_read(&dest->conn_flags) & IP_VS_CONN_F_FWD_MASK); | 3047 | IP_VS_CONN_F_FWD_MASK)) || |
3046 | NLA_PUT_U32(skb, IPVS_DEST_ATTR_WEIGHT, atomic_read(&dest->weight)); | 3048 | nla_put_u32(skb, IPVS_DEST_ATTR_WEIGHT, |
3047 | NLA_PUT_U32(skb, IPVS_DEST_ATTR_U_THRESH, dest->u_threshold); | 3049 | atomic_read(&dest->weight)) || |
3048 | NLA_PUT_U32(skb, IPVS_DEST_ATTR_L_THRESH, dest->l_threshold); | 3050 | nla_put_u32(skb, IPVS_DEST_ATTR_U_THRESH, dest->u_threshold) || |
3049 | NLA_PUT_U32(skb, IPVS_DEST_ATTR_ACTIVE_CONNS, | 3051 | nla_put_u32(skb, IPVS_DEST_ATTR_L_THRESH, dest->l_threshold) || |
3050 | atomic_read(&dest->activeconns)); | 3052 | nla_put_u32(skb, IPVS_DEST_ATTR_ACTIVE_CONNS, |
3051 | NLA_PUT_U32(skb, IPVS_DEST_ATTR_INACT_CONNS, | 3053 | atomic_read(&dest->activeconns)) || |
3052 | atomic_read(&dest->inactconns)); | 3054 | nla_put_u32(skb, IPVS_DEST_ATTR_INACT_CONNS, |
3053 | NLA_PUT_U32(skb, IPVS_DEST_ATTR_PERSIST_CONNS, | 3055 | atomic_read(&dest->inactconns)) || |
3054 | atomic_read(&dest->persistconns)); | 3056 | nla_put_u32(skb, IPVS_DEST_ATTR_PERSIST_CONNS, |
3055 | 3057 | atomic_read(&dest->persistconns))) | |
3058 | goto nla_put_failure; | ||
3056 | if (ip_vs_genl_fill_stats(skb, IPVS_DEST_ATTR_STATS, &dest->stats)) | 3059 | if (ip_vs_genl_fill_stats(skb, IPVS_DEST_ATTR_STATS, &dest->stats)) |
3057 | goto nla_put_failure; | 3060 | goto nla_put_failure; |
3058 | 3061 | ||
@@ -3181,10 +3184,10 @@ static int ip_vs_genl_fill_daemon(struct sk_buff *skb, __be32 state, | |||
3181 | if (!nl_daemon) | 3184 | if (!nl_daemon) |
3182 | return -EMSGSIZE; | 3185 | return -EMSGSIZE; |
3183 | 3186 | ||
3184 | NLA_PUT_U32(skb, IPVS_DAEMON_ATTR_STATE, state); | 3187 | if (nla_put_u32(skb, IPVS_DAEMON_ATTR_STATE, state) || |
3185 | NLA_PUT_STRING(skb, IPVS_DAEMON_ATTR_MCAST_IFN, mcast_ifn); | 3188 | nla_put_string(skb, IPVS_DAEMON_ATTR_MCAST_IFN, mcast_ifn) || |
3186 | NLA_PUT_U32(skb, IPVS_DAEMON_ATTR_SYNC_ID, syncid); | 3189 | nla_put_u32(skb, IPVS_DAEMON_ATTR_SYNC_ID, syncid)) |
3187 | 3190 | goto nla_put_failure; | |
3188 | nla_nest_end(skb, nl_daemon); | 3191 | nla_nest_end(skb, nl_daemon); |
3189 | 3192 | ||
3190 | return 0; | 3193 | return 0; |
@@ -3473,21 +3476,26 @@ static int ip_vs_genl_get_cmd(struct sk_buff *skb, struct genl_info *info) | |||
3473 | 3476 | ||
3474 | __ip_vs_get_timeouts(net, &t); | 3477 | __ip_vs_get_timeouts(net, &t); |
3475 | #ifdef CONFIG_IP_VS_PROTO_TCP | 3478 | #ifdef CONFIG_IP_VS_PROTO_TCP |
3476 | NLA_PUT_U32(msg, IPVS_CMD_ATTR_TIMEOUT_TCP, t.tcp_timeout); | 3479 | if (nla_put_u32(msg, IPVS_CMD_ATTR_TIMEOUT_TCP, |
3477 | NLA_PUT_U32(msg, IPVS_CMD_ATTR_TIMEOUT_TCP_FIN, | 3480 | t.tcp_timeout) || |
3478 | t.tcp_fin_timeout); | 3481 | nla_put_u32(msg, IPVS_CMD_ATTR_TIMEOUT_TCP_FIN, |
3482 | t.tcp_fin_timeout)) | ||
3483 | goto nla_put_failure; | ||
3479 | #endif | 3484 | #endif |
3480 | #ifdef CONFIG_IP_VS_PROTO_UDP | 3485 | #ifdef CONFIG_IP_VS_PROTO_UDP |
3481 | NLA_PUT_U32(msg, IPVS_CMD_ATTR_TIMEOUT_UDP, t.udp_timeout); | 3486 | if (nla_put_u32(msg, IPVS_CMD_ATTR_TIMEOUT_UDP, t.udp_timeout)) |
3487 | goto nla_put_failure; | ||
3482 | #endif | 3488 | #endif |
3483 | 3489 | ||
3484 | break; | 3490 | break; |
3485 | } | 3491 | } |
3486 | 3492 | ||
3487 | case IPVS_CMD_GET_INFO: | 3493 | case IPVS_CMD_GET_INFO: |
3488 | NLA_PUT_U32(msg, IPVS_INFO_ATTR_VERSION, IP_VS_VERSION_CODE); | 3494 | if (nla_put_u32(msg, IPVS_INFO_ATTR_VERSION, |
3489 | NLA_PUT_U32(msg, IPVS_INFO_ATTR_CONN_TAB_SIZE, | 3495 | IP_VS_VERSION_CODE) || |
3490 | ip_vs_conn_tab_size); | 3496 | nla_put_u32(msg, IPVS_INFO_ATTR_CONN_TAB_SIZE, |
3497 | ip_vs_conn_tab_size)) | ||
3498 | goto nla_put_failure; | ||
3491 | break; | 3499 | break; |
3492 | } | 3500 | } |
3493 | 3501 | ||