aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-04-01 18:50:08 -0400
committerDavid S. Miller <davem@davemloft.net>2012-04-01 18:50:08 -0400
commit4925a459e96767e84b112c023c3766d4aeefb611 (patch)
treed55f19d684ed0d2c061969e8cce1e3544c9d8b4b /net
parent3c60a17b1b55ac4a72382502c952222b7649d63b (diff)
nf_conntrack_proto_tcp: 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>
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/nf_conntrack_proto_tcp.c68
1 files changed, 35 insertions, 33 deletions
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
index 361eade62a09..cc558162493b 100644
--- a/net/netfilter/nf_conntrack_proto_tcp.c
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
@@ -1147,21 +1147,22 @@ static int tcp_to_nlattr(struct sk_buff *skb, struct nlattr *nla,
1147 if (!nest_parms) 1147 if (!nest_parms)
1148 goto nla_put_failure; 1148 goto nla_put_failure;
1149 1149
1150 NLA_PUT_U8(skb, CTA_PROTOINFO_TCP_STATE, ct->proto.tcp.state); 1150 if (nla_put_u8(skb, CTA_PROTOINFO_TCP_STATE, ct->proto.tcp.state) ||
1151 1151 nla_put_u8(skb, CTA_PROTOINFO_TCP_WSCALE_ORIGINAL,
1152 NLA_PUT_U8(skb, CTA_PROTOINFO_TCP_WSCALE_ORIGINAL, 1152 ct->proto.tcp.seen[0].td_scale) ||
1153 ct->proto.tcp.seen[0].td_scale); 1153 nla_put_u8(skb, CTA_PROTOINFO_TCP_WSCALE_REPLY,
1154 1154 ct->proto.tcp.seen[1].td_scale))
1155 NLA_PUT_U8(skb, CTA_PROTOINFO_TCP_WSCALE_REPLY, 1155 goto nla_put_failure;
1156 ct->proto.tcp.seen[1].td_scale);
1157 1156
1158 tmp.flags = ct->proto.tcp.seen[0].flags; 1157 tmp.flags = ct->proto.tcp.seen[0].flags;
1159 NLA_PUT(skb, CTA_PROTOINFO_TCP_FLAGS_ORIGINAL, 1158 if (nla_put(skb, CTA_PROTOINFO_TCP_FLAGS_ORIGINAL,
1160 sizeof(struct nf_ct_tcp_flags), &tmp); 1159 sizeof(struct nf_ct_tcp_flags), &tmp))
1160 goto nla_put_failure;
1161 1161
1162 tmp.flags = ct->proto.tcp.seen[1].flags; 1162 tmp.flags = ct->proto.tcp.seen[1].flags;
1163 NLA_PUT(skb, CTA_PROTOINFO_TCP_FLAGS_REPLY, 1163 if (nla_put(skb, CTA_PROTOINFO_TCP_FLAGS_REPLY,
1164 sizeof(struct nf_ct_tcp_flags), &tmp); 1164 sizeof(struct nf_ct_tcp_flags), &tmp))
1165 goto nla_put_failure;
1165 spin_unlock_bh(&ct->lock); 1166 spin_unlock_bh(&ct->lock);
1166 1167
1167 nla_nest_end(skb, nest_parms); 1168 nla_nest_end(skb, nest_parms);
@@ -1310,28 +1311,29 @@ tcp_timeout_obj_to_nlattr(struct sk_buff *skb, const void *data)
1310{ 1311{
1311 const unsigned int *timeouts = data; 1312 const unsigned int *timeouts = data;
1312 1313
1313 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_SYN_SENT, 1314 if (nla_put_be32(skb, CTA_TIMEOUT_TCP_SYN_SENT,
1314 htonl(timeouts[TCP_CONNTRACK_SYN_SENT] / HZ)); 1315 htonl(timeouts[TCP_CONNTRACK_SYN_SENT] / HZ)) ||
1315 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_SYN_RECV, 1316 nla_put_be32(skb, CTA_TIMEOUT_TCP_SYN_RECV,
1316 htonl(timeouts[TCP_CONNTRACK_SYN_RECV] / HZ)); 1317 htonl(timeouts[TCP_CONNTRACK_SYN_RECV] / HZ)) ||
1317 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_ESTABLISHED, 1318 nla_put_be32(skb, CTA_TIMEOUT_TCP_ESTABLISHED,
1318 htonl(timeouts[TCP_CONNTRACK_ESTABLISHED] / HZ)); 1319 htonl(timeouts[TCP_CONNTRACK_ESTABLISHED] / HZ)) ||
1319 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_FIN_WAIT, 1320 nla_put_be32(skb, CTA_TIMEOUT_TCP_FIN_WAIT,
1320 htonl(timeouts[TCP_CONNTRACK_FIN_WAIT] / HZ)); 1321 htonl(timeouts[TCP_CONNTRACK_FIN_WAIT] / HZ)) ||
1321 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_CLOSE_WAIT, 1322 nla_put_be32(skb, CTA_TIMEOUT_TCP_CLOSE_WAIT,
1322 htonl(timeouts[TCP_CONNTRACK_CLOSE_WAIT] / HZ)); 1323 htonl(timeouts[TCP_CONNTRACK_CLOSE_WAIT] / HZ)) ||
1323 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_LAST_ACK, 1324 nla_put_be32(skb, CTA_TIMEOUT_TCP_LAST_ACK,
1324 htonl(timeouts[TCP_CONNTRACK_LAST_ACK] / HZ)); 1325 htonl(timeouts[TCP_CONNTRACK_LAST_ACK] / HZ)) ||
1325 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_TIME_WAIT, 1326 nla_put_be32(skb, CTA_TIMEOUT_TCP_TIME_WAIT,
1326 htonl(timeouts[TCP_CONNTRACK_TIME_WAIT] / HZ)); 1327 htonl(timeouts[TCP_CONNTRACK_TIME_WAIT] / HZ)) ||
1327 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_CLOSE, 1328 nla_put_be32(skb, CTA_TIMEOUT_TCP_CLOSE,
1328 htonl(timeouts[TCP_CONNTRACK_CLOSE] / HZ)); 1329 htonl(timeouts[TCP_CONNTRACK_CLOSE] / HZ)) ||
1329 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_SYN_SENT2, 1330 nla_put_be32(skb, CTA_TIMEOUT_TCP_SYN_SENT2,
1330 htonl(timeouts[TCP_CONNTRACK_SYN_SENT2] / HZ)); 1331 htonl(timeouts[TCP_CONNTRACK_SYN_SENT2] / HZ)) ||
1331 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_RETRANS, 1332 nla_put_be32(skb, CTA_TIMEOUT_TCP_RETRANS,
1332 htonl(timeouts[TCP_CONNTRACK_RETRANS] / HZ)); 1333 htonl(timeouts[TCP_CONNTRACK_RETRANS] / HZ)) ||
1333 NLA_PUT_BE32(skb, CTA_TIMEOUT_TCP_UNACK, 1334 nla_put_be32(skb, CTA_TIMEOUT_TCP_UNACK,
1334 htonl(timeouts[TCP_CONNTRACK_UNACK] / HZ)); 1335 htonl(timeouts[TCP_CONNTRACK_UNACK] / HZ)))
1336 goto nla_put_failure;
1335 return 0; 1337 return 0;
1336 1338
1337nla_put_failure: 1339nla_put_failure: