Commit 1eb4c977 authored by David S. Miller's avatar David S. Miller

dcbnl: 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: default avatarDavid S. Miller <davem@davemloft.net>
parent 60aed2ab
...@@ -1205,13 +1205,15 @@ static int dcbnl_build_peer_app(struct net_device *netdev, struct sk_buff* skb, ...@@ -1205,13 +1205,15 @@ static int dcbnl_build_peer_app(struct net_device *netdev, struct sk_buff* skb,
if (!app) if (!app)
goto nla_put_failure; goto nla_put_failure;
if (app_info_type) if (app_info_type &&
NLA_PUT(skb, app_info_type, sizeof(info), &info); nla_put(skb, app_info_type, sizeof(info), &info))
goto nla_put_failure;
for (i = 0; i < app_count; i++)
NLA_PUT(skb, app_entry_type, sizeof(struct dcb_app),
&table[i]);
for (i = 0; i < app_count; i++) {
if (nla_put(skb, app_entry_type, sizeof(struct dcb_app),
&table[i]))
goto nla_put_failure;
}
nla_nest_end(skb, app); nla_nest_end(skb, app);
} }
err = 0; err = 0;
...@@ -1230,8 +1232,8 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev) ...@@ -1230,8 +1232,8 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
int dcbx; int dcbx;
int err = -EMSGSIZE; int err = -EMSGSIZE;
NLA_PUT_STRING(skb, DCB_ATTR_IFNAME, netdev->name); if (nla_put_string(skb, DCB_ATTR_IFNAME, netdev->name))
goto nla_put_failure;
ieee = nla_nest_start(skb, DCB_ATTR_IEEE); ieee = nla_nest_start(skb, DCB_ATTR_IEEE);
if (!ieee) if (!ieee)
goto nla_put_failure; goto nla_put_failure;
...@@ -1239,15 +1241,17 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev) ...@@ -1239,15 +1241,17 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
if (ops->ieee_getets) { if (ops->ieee_getets) {
struct ieee_ets ets; struct ieee_ets ets;
err = ops->ieee_getets(netdev, &ets); err = ops->ieee_getets(netdev, &ets);
if (!err) if (!err &&
NLA_PUT(skb, DCB_ATTR_IEEE_ETS, sizeof(ets), &ets); nla_put(skb, DCB_ATTR_IEEE_ETS, sizeof(ets), &ets))
goto nla_put_failure;
} }
if (ops->ieee_getpfc) { if (ops->ieee_getpfc) {
struct ieee_pfc pfc; struct ieee_pfc pfc;
err = ops->ieee_getpfc(netdev, &pfc); err = ops->ieee_getpfc(netdev, &pfc);
if (!err) if (!err &&
NLA_PUT(skb, DCB_ATTR_IEEE_PFC, sizeof(pfc), &pfc); nla_put(skb, DCB_ATTR_IEEE_PFC, sizeof(pfc), &pfc))
goto nla_put_failure;
} }
app = nla_nest_start(skb, DCB_ATTR_IEEE_APP_TABLE); app = nla_nest_start(skb, DCB_ATTR_IEEE_APP_TABLE);
...@@ -1278,15 +1282,17 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev) ...@@ -1278,15 +1282,17 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
if (ops->ieee_peer_getets) { if (ops->ieee_peer_getets) {
struct ieee_ets ets; struct ieee_ets ets;
err = ops->ieee_peer_getets(netdev, &ets); err = ops->ieee_peer_getets(netdev, &ets);
if (!err) if (!err &&
NLA_PUT(skb, DCB_ATTR_IEEE_PEER_ETS, sizeof(ets), &ets); nla_put(skb, DCB_ATTR_IEEE_PEER_ETS, sizeof(ets), &ets))
goto nla_put_failure;
} }
if (ops->ieee_peer_getpfc) { if (ops->ieee_peer_getpfc) {
struct ieee_pfc pfc; struct ieee_pfc pfc;
err = ops->ieee_peer_getpfc(netdev, &pfc); err = ops->ieee_peer_getpfc(netdev, &pfc);
if (!err) if (!err &&
NLA_PUT(skb, DCB_ATTR_IEEE_PEER_PFC, sizeof(pfc), &pfc); nla_put(skb, DCB_ATTR_IEEE_PEER_PFC, sizeof(pfc), &pfc))
goto nla_put_failure;
} }
if (ops->peer_getappinfo && ops->peer_getapptable) { if (ops->peer_getappinfo && ops->peer_getapptable) {
...@@ -1340,10 +1346,11 @@ static int dcbnl_cee_pg_fill(struct sk_buff *skb, struct net_device *dev, ...@@ -1340,10 +1346,11 @@ static int dcbnl_cee_pg_fill(struct sk_buff *skb, struct net_device *dev,
ops->getpgtccfgtx(dev, i - DCB_PG_ATTR_TC_0, ops->getpgtccfgtx(dev, i - DCB_PG_ATTR_TC_0,
&prio, &pgid, &tc_pct, &up_map); &prio, &pgid, &tc_pct, &up_map);
NLA_PUT_U8(skb, DCB_TC_ATTR_PARAM_PGID, pgid); if (nla_put_u8(skb, DCB_TC_ATTR_PARAM_PGID, pgid) ||
NLA_PUT_U8(skb, DCB_TC_ATTR_PARAM_UP_MAPPING, up_map); nla_put_u8(skb, DCB_TC_ATTR_PARAM_UP_MAPPING, up_map) ||
NLA_PUT_U8(skb, DCB_TC_ATTR_PARAM_STRICT_PRIO, prio); nla_put_u8(skb, DCB_TC_ATTR_PARAM_STRICT_PRIO, prio) ||
NLA_PUT_U8(skb, DCB_TC_ATTR_PARAM_BW_PCT, tc_pct); nla_put_u8(skb, DCB_TC_ATTR_PARAM_BW_PCT, tc_pct))
goto nla_put_failure;
nla_nest_end(skb, tc_nest); nla_nest_end(skb, tc_nest);
} }
...@@ -1356,7 +1363,8 @@ static int dcbnl_cee_pg_fill(struct sk_buff *skb, struct net_device *dev, ...@@ -1356,7 +1363,8 @@ static int dcbnl_cee_pg_fill(struct sk_buff *skb, struct net_device *dev,
else else
ops->getpgbwgcfgtx(dev, i - DCB_PG_ATTR_BW_ID_0, ops->getpgbwgcfgtx(dev, i - DCB_PG_ATTR_BW_ID_0,
&tc_pct); &tc_pct);
NLA_PUT_U8(skb, i, tc_pct); if (nla_put_u8(skb, i, tc_pct))
goto nla_put_failure;
} }
nla_nest_end(skb, pg); nla_nest_end(skb, pg);
return 0; return 0;
...@@ -1373,8 +1381,8 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev) ...@@ -1373,8 +1381,8 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev)
int dcbx, i, err = -EMSGSIZE; int dcbx, i, err = -EMSGSIZE;
u8 value; u8 value;
NLA_PUT_STRING(skb, DCB_ATTR_IFNAME, netdev->name); if (nla_put_string(skb, DCB_ATTR_IFNAME, netdev->name))
goto nla_put_failure;
cee = nla_nest_start(skb, DCB_ATTR_CEE); cee = nla_nest_start(skb, DCB_ATTR_CEE);
if (!cee) if (!cee)
goto nla_put_failure; goto nla_put_failure;
...@@ -1401,7 +1409,8 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev) ...@@ -1401,7 +1409,8 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev)
for (i = DCB_PFC_UP_ATTR_0; i <= DCB_PFC_UP_ATTR_7; i++) { for (i = DCB_PFC_UP_ATTR_0; i <= DCB_PFC_UP_ATTR_7; i++) {
ops->getpfccfg(netdev, i - DCB_PFC_UP_ATTR_0, &value); ops->getpfccfg(netdev, i - DCB_PFC_UP_ATTR_0, &value);
NLA_PUT_U8(skb, i, value); if (nla_put_u8(skb, i, value))
goto nla_put_failure;
} }
nla_nest_end(skb, pfc_nest); nla_nest_end(skb, pfc_nest);
} }
...@@ -1454,8 +1463,9 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev) ...@@ -1454,8 +1463,9 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev)
for (i = DCB_FEATCFG_ATTR_ALL + 1; i <= DCB_FEATCFG_ATTR_MAX; for (i = DCB_FEATCFG_ATTR_ALL + 1; i <= DCB_FEATCFG_ATTR_MAX;
i++) i++)
if (!ops->getfeatcfg(netdev, i, &value)) if (!ops->getfeatcfg(netdev, i, &value) &&
NLA_PUT_U8(skb, i, value); nla_put_u8(skb, i, value))
goto nla_put_failure;
nla_nest_end(skb, feat); nla_nest_end(skb, feat);
} }
...@@ -1464,15 +1474,17 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev) ...@@ -1464,15 +1474,17 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev)
if (ops->cee_peer_getpg) { if (ops->cee_peer_getpg) {
struct cee_pg pg; struct cee_pg pg;
err = ops->cee_peer_getpg(netdev, &pg); err = ops->cee_peer_getpg(netdev, &pg);
if (!err) if (!err &&
NLA_PUT(skb, DCB_ATTR_CEE_PEER_PG, sizeof(pg), &pg); nla_put(skb, DCB_ATTR_CEE_PEER_PG, sizeof(pg), &pg))
goto nla_put_failure;
} }
if (ops->cee_peer_getpfc) { if (ops->cee_peer_getpfc) {
struct cee_pfc pfc; struct cee_pfc pfc;
err = ops->cee_peer_getpfc(netdev, &pfc); err = ops->cee_peer_getpfc(netdev, &pfc);
if (!err) if (!err &&
NLA_PUT(skb, DCB_ATTR_CEE_PEER_PFC, sizeof(pfc), &pfc); nla_put(skb, DCB_ATTR_CEE_PEER_PFC, sizeof(pfc), &pfc))
goto nla_put_failure;
} }
if (ops->peer_getappinfo && ops->peer_getapptable) { if (ops->peer_getappinfo && ops->peer_getapptable) {
......
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