@@ -1137,8 +1137,9 @@ static void neigh_update_hhs(struct neighbour *neigh)
1137
1137
Caller MUST hold reference count on the entry.
1138
1138
*/
1139
1139
1140
- int neigh_update (struct neighbour * neigh , const u8 * lladdr , u8 new ,
1141
- u32 flags , u32 nlmsg_pid )
1140
+ static int __neigh_update (struct neighbour * neigh , const u8 * lladdr ,
1141
+ u8 new , u32 flags , u32 nlmsg_pid ,
1142
+ struct netlink_ext_ack * extack )
1142
1143
{
1143
1144
u8 old ;
1144
1145
int err ;
@@ -1155,8 +1156,10 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
1155
1156
if (!(flags & NEIGH_UPDATE_F_ADMIN ) &&
1156
1157
(old & (NUD_NOARP | NUD_PERMANENT )))
1157
1158
goto out ;
1158
- if (neigh -> dead )
1159
+ if (neigh -> dead ) {
1160
+ NL_SET_ERR_MSG (extack , "Neighbor entry is now dead" );
1159
1161
goto out ;
1162
+ }
1160
1163
1161
1164
neigh_update_ext_learned (neigh , flags , & notify );
1162
1165
@@ -1193,8 +1196,10 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
1193
1196
use it, otherwise discard the request.
1194
1197
*/
1195
1198
err = - EINVAL ;
1196
- if (!(old & NUD_VALID ))
1199
+ if (!(old & NUD_VALID )) {
1200
+ NL_SET_ERR_MSG (extack , "No link layer address given" );
1197
1201
goto out ;
1202
+ }
1198
1203
lladdr = neigh -> ha ;
1199
1204
}
1200
1205
@@ -1307,6 +1312,12 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
1307
1312
1308
1313
return err ;
1309
1314
}
1315
+
1316
+ int neigh_update (struct neighbour * neigh , const u8 * lladdr , u8 new ,
1317
+ u32 flags , u32 nlmsg_pid )
1318
+ {
1319
+ return __neigh_update (neigh , lladdr , new , flags , nlmsg_pid , NULL );
1320
+ }
1310
1321
EXPORT_SYMBOL (neigh_update );
1311
1322
1312
1323
/* Update the neigh to listen temporarily for probe responses, even if it is
@@ -1678,8 +1689,10 @@ static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh,
1678
1689
goto out ;
1679
1690
1680
1691
dst_attr = nlmsg_find_attr (nlh , sizeof (* ndm ), NDA_DST );
1681
- if (dst_attr == NULL )
1692
+ if (!dst_attr ) {
1693
+ NL_SET_ERR_MSG (extack , "Network address not specified" );
1682
1694
goto out ;
1695
+ }
1683
1696
1684
1697
ndm = nlmsg_data (nlh );
1685
1698
if (ndm -> ndm_ifindex ) {
@@ -1694,8 +1707,10 @@ static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh,
1694
1707
if (tbl == NULL )
1695
1708
return - EAFNOSUPPORT ;
1696
1709
1697
- if (nla_len (dst_attr ) < (int )tbl -> key_len )
1710
+ if (nla_len (dst_attr ) < (int )tbl -> key_len ) {
1711
+ NL_SET_ERR_MSG (extack , "Invalid network address" );
1698
1712
goto out ;
1713
+ }
1699
1714
1700
1715
if (ndm -> ndm_flags & NTF_PROXY ) {
1701
1716
err = pneigh_delete (tbl , net , nla_data (dst_attr ), dev );
@@ -1711,10 +1726,9 @@ static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh,
1711
1726
goto out ;
1712
1727
}
1713
1728
1714
- err = neigh_update (neigh , NULL , NUD_FAILED ,
1715
- NEIGH_UPDATE_F_OVERRIDE |
1716
- NEIGH_UPDATE_F_ADMIN ,
1717
- NETLINK_CB (skb ).portid );
1729
+ err = __neigh_update (neigh , NULL , NUD_FAILED ,
1730
+ NEIGH_UPDATE_F_OVERRIDE | NEIGH_UPDATE_F_ADMIN ,
1731
+ NETLINK_CB (skb ).portid , extack );
1718
1732
write_lock_bh (& tbl -> lock );
1719
1733
neigh_release (neigh );
1720
1734
neigh_remove_one (neigh , tbl );
@@ -1744,8 +1758,10 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
1744
1758
goto out ;
1745
1759
1746
1760
err = - EINVAL ;
1747
- if (tb [NDA_DST ] == NULL )
1761
+ if (!tb [NDA_DST ]) {
1762
+ NL_SET_ERR_MSG (extack , "Network address not specified" );
1748
1763
goto out ;
1764
+ }
1749
1765
1750
1766
ndm = nlmsg_data (nlh );
1751
1767
if (ndm -> ndm_ifindex ) {
@@ -1755,16 +1771,21 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
1755
1771
goto out ;
1756
1772
}
1757
1773
1758
- if (tb [NDA_LLADDR ] && nla_len (tb [NDA_LLADDR ]) < dev -> addr_len )
1774
+ if (tb [NDA_LLADDR ] && nla_len (tb [NDA_LLADDR ]) < dev -> addr_len ) {
1775
+ NL_SET_ERR_MSG (extack , "Invalid link address" );
1759
1776
goto out ;
1777
+ }
1760
1778
}
1761
1779
1762
1780
tbl = neigh_find_table (ndm -> ndm_family );
1763
1781
if (tbl == NULL )
1764
1782
return - EAFNOSUPPORT ;
1765
1783
1766
- if (nla_len (tb [NDA_DST ]) < (int )tbl -> key_len )
1784
+ if (nla_len (tb [NDA_DST ]) < (int )tbl -> key_len ) {
1785
+ NL_SET_ERR_MSG (extack , "Invalid network address" );
1767
1786
goto out ;
1787
+ }
1788
+
1768
1789
dst = nla_data (tb [NDA_DST ]);
1769
1790
lladdr = tb [NDA_LLADDR ] ? nla_data (tb [NDA_LLADDR ]) : NULL ;
1770
1791
@@ -1780,8 +1801,10 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
1780
1801
goto out ;
1781
1802
}
1782
1803
1783
- if (dev == NULL )
1804
+ if (!dev ) {
1805
+ NL_SET_ERR_MSG (extack , "Device not specified" );
1784
1806
goto out ;
1807
+ }
1785
1808
1786
1809
neigh = neigh_lookup (tbl , dst , dev );
1787
1810
if (neigh == NULL ) {
@@ -1817,8 +1840,8 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh,
1817
1840
neigh_event_send (neigh , NULL );
1818
1841
err = 0 ;
1819
1842
} else
1820
- err = neigh_update (neigh , lladdr , ndm -> ndm_state , flags ,
1821
- NETLINK_CB (skb ).portid );
1843
+ err = __neigh_update (neigh , lladdr , ndm -> ndm_state , flags ,
1844
+ NETLINK_CB (skb ).portid , extack );
1822
1845
neigh_release (neigh );
1823
1846
1824
1847
out :
0 commit comments