hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
....@@ -181,15 +181,18 @@
181181 struct tipc_nl_compat_msg *msg,
182182 struct sk_buff *arg)
183183 {
184
+ struct genl_dumpit_info info;
184185 int len = 0;
185186 int err;
186187 struct sk_buff *buf;
187188 struct nlmsghdr *nlmsg;
188189 struct netlink_callback cb;
190
+ struct nlattr **attrbuf;
189191
190192 memset(&cb, 0, sizeof(cb));
191193 cb.nlh = (struct nlmsghdr *)arg->data;
192194 cb.skb = arg;
195
+ cb.data = &info;
193196
194197 buf = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
195198 if (!buf)
....@@ -201,19 +204,35 @@
201204 return -ENOMEM;
202205 }
203206
207
+ attrbuf = kcalloc(tipc_genl_family.maxattr + 1,
208
+ sizeof(struct nlattr *), GFP_KERNEL);
209
+ if (!attrbuf) {
210
+ err = -ENOMEM;
211
+ goto err_out;
212
+ }
213
+
214
+ info.attrs = attrbuf;
215
+ err = nlmsg_parse_deprecated(cb.nlh, GENL_HDRLEN, attrbuf,
216
+ tipc_genl_family.maxattr,
217
+ tipc_genl_family.policy, NULL);
218
+ if (err)
219
+ goto err_out;
220
+
204221 do {
205222 int rem;
206223
207224 len = (*cmd->dumpit)(buf, &cb);
208225
209226 nlmsg_for_each_msg(nlmsg, nlmsg_hdr(buf), len, rem) {
210
- struct nlattr **attrs;
211
-
212
- err = tipc_nlmsg_parse(nlmsg, &attrs);
227
+ err = nlmsg_parse_deprecated(nlmsg, GENL_HDRLEN,
228
+ attrbuf,
229
+ tipc_genl_family.maxattr,
230
+ tipc_genl_family.policy,
231
+ NULL);
213232 if (err)
214233 goto err_out;
215234
216
- err = (*cmd->format)(msg, attrs);
235
+ err = (*cmd->format)(msg, attrbuf);
217236 if (err)
218237 goto err_out;
219238
....@@ -231,6 +250,7 @@
231250 err = 0;
232251
233252 err_out:
253
+ kfree(attrbuf);
234254 tipc_dump_done(&cb);
235255 kfree_skb(buf);
236256
....@@ -340,9 +360,9 @@
340360 if (err)
341361 goto doit_out;
342362
343
- err = nla_parse(attrbuf, tipc_genl_family.maxattr,
344
- (const struct nlattr *)trans_buf->data,
345
- trans_buf->len, NULL, NULL);
363
+ err = nla_parse_deprecated(attrbuf, tipc_genl_family.maxattr,
364
+ (const struct nlattr *)trans_buf->data,
365
+ trans_buf->len, NULL, NULL);
346366 if (err)
347367 goto doit_out;
348368
....@@ -391,8 +411,8 @@
391411 if (!attrs[TIPC_NLA_BEARER])
392412 return -EINVAL;
393413
394
- err = nla_parse_nested(bearer, TIPC_NLA_BEARER_MAX,
395
- attrs[TIPC_NLA_BEARER], NULL, NULL);
414
+ err = nla_parse_nested_deprecated(bearer, TIPC_NLA_BEARER_MAX,
415
+ attrs[TIPC_NLA_BEARER], NULL, NULL);
396416 if (err)
397417 return err;
398418
....@@ -412,7 +432,7 @@
412432
413433 b = (struct tipc_bearer_config *)TLV_DATA(msg->req);
414434
415
- bearer = nla_nest_start(skb, TIPC_NLA_BEARER);
435
+ bearer = nla_nest_start_noflag(skb, TIPC_NLA_BEARER);
416436 if (!bearer)
417437 return -EMSGSIZE;
418438
....@@ -432,7 +452,7 @@
432452 return -EMSGSIZE;
433453
434454 if (ntohl(b->priority) <= TIPC_MAX_LINK_PRI) {
435
- prop = nla_nest_start(skb, TIPC_NLA_BEARER_PROP);
455
+ prop = nla_nest_start_noflag(skb, TIPC_NLA_BEARER_PROP);
436456 if (!prop)
437457 return -EMSGSIZE;
438458 if (nla_put_u32(skb, TIPC_NLA_PROP_PRIO, ntohl(b->priority)))
....@@ -454,7 +474,7 @@
454474
455475 name = (char *)TLV_DATA(msg->req);
456476
457
- bearer = nla_nest_start(skb, TIPC_NLA_BEARER);
477
+ bearer = nla_nest_start_noflag(skb, TIPC_NLA_BEARER);
458478 if (!bearer)
459479 return -EMSGSIZE;
460480
....@@ -531,24 +551,26 @@
531551 if (!attrs[TIPC_NLA_LINK])
532552 return -EINVAL;
533553
534
- err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK],
535
- NULL, NULL);
554
+ err = nla_parse_nested_deprecated(link, TIPC_NLA_LINK_MAX,
555
+ attrs[TIPC_NLA_LINK], NULL, NULL);
536556 if (err)
537557 return err;
538558
539559 if (!link[TIPC_NLA_LINK_PROP])
540560 return -EINVAL;
541561
542
- err = nla_parse_nested(prop, TIPC_NLA_PROP_MAX,
543
- link[TIPC_NLA_LINK_PROP], NULL, NULL);
562
+ err = nla_parse_nested_deprecated(prop, TIPC_NLA_PROP_MAX,
563
+ link[TIPC_NLA_LINK_PROP], NULL,
564
+ NULL);
544565 if (err)
545566 return err;
546567
547568 if (!link[TIPC_NLA_LINK_STATS])
548569 return -EINVAL;
549570
550
- err = nla_parse_nested(stats, TIPC_NLA_STATS_MAX,
551
- link[TIPC_NLA_LINK_STATS], NULL, NULL);
571
+ err = nla_parse_nested_deprecated(stats, TIPC_NLA_STATS_MAX,
572
+ link[TIPC_NLA_LINK_STATS], NULL,
573
+ NULL);
552574 if (err)
553575 return err;
554576
....@@ -666,8 +688,8 @@
666688 if (!attrs[TIPC_NLA_LINK])
667689 return -EINVAL;
668690
669
- err = nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK],
670
- NULL, NULL);
691
+ err = nla_parse_nested_deprecated(link, TIPC_NLA_LINK_MAX,
692
+ attrs[TIPC_NLA_LINK], NULL, NULL);
671693 if (err)
672694 return err;
673695
....@@ -702,22 +724,17 @@
702724 struct nlattr *prop;
703725 struct nlattr *media;
704726 struct tipc_link_config *lc;
705
- int len;
706727
707728 lc = (struct tipc_link_config *)TLV_DATA(msg->req);
708729
709
- media = nla_nest_start(skb, TIPC_NLA_MEDIA);
730
+ media = nla_nest_start_noflag(skb, TIPC_NLA_MEDIA);
710731 if (!media)
711732 return -EMSGSIZE;
712
-
713
- len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_MEDIA_NAME);
714
- if (!string_is_valid(lc->name, len))
715
- return -EINVAL;
716733
717734 if (nla_put_string(skb, TIPC_NLA_MEDIA_NAME, lc->name))
718735 return -EMSGSIZE;
719736
720
- prop = nla_nest_start(skb, TIPC_NLA_MEDIA_PROP);
737
+ prop = nla_nest_start_noflag(skb, TIPC_NLA_MEDIA_PROP);
721738 if (!prop)
722739 return -EMSGSIZE;
723740
....@@ -734,22 +751,17 @@
734751 struct nlattr *prop;
735752 struct nlattr *bearer;
736753 struct tipc_link_config *lc;
737
- int len;
738754
739755 lc = (struct tipc_link_config *)TLV_DATA(msg->req);
740756
741
- bearer = nla_nest_start(skb, TIPC_NLA_BEARER);
757
+ bearer = nla_nest_start_noflag(skb, TIPC_NLA_BEARER);
742758 if (!bearer)
743759 return -EMSGSIZE;
744
-
745
- len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_MEDIA_NAME);
746
- if (!string_is_valid(lc->name, len))
747
- return -EINVAL;
748760
749761 if (nla_put_string(skb, TIPC_NLA_BEARER_NAME, lc->name))
750762 return -EMSGSIZE;
751763
752
- prop = nla_nest_start(skb, TIPC_NLA_BEARER_PROP);
764
+ prop = nla_nest_start_noflag(skb, TIPC_NLA_BEARER_PROP);
753765 if (!prop)
754766 return -EMSGSIZE;
755767
....@@ -769,14 +781,14 @@
769781
770782 lc = (struct tipc_link_config *)TLV_DATA(msg->req);
771783
772
- link = nla_nest_start(skb, TIPC_NLA_LINK);
784
+ link = nla_nest_start_noflag(skb, TIPC_NLA_LINK);
773785 if (!link)
774786 return -EMSGSIZE;
775787
776788 if (nla_put_string(skb, TIPC_NLA_LINK_NAME, lc->name))
777789 return -EMSGSIZE;
778790
779
- prop = nla_nest_start(skb, TIPC_NLA_LINK_PROP);
791
+ prop = nla_nest_start_noflag(skb, TIPC_NLA_LINK_PROP);
780792 if (!prop)
781793 return -EMSGSIZE;
782794
....@@ -832,7 +844,7 @@
832844
833845 name = (char *)TLV_DATA(msg->req);
834846
835
- link = nla_nest_start(skb, TIPC_NLA_LINK);
847
+ link = nla_nest_start_noflag(skb, TIPC_NLA_LINK);
836848 if (!link)
837849 return -EMSGSIZE;
838850
....@@ -865,7 +877,7 @@
865877 };
866878
867879 ntq = (struct tipc_name_table_query *)TLV_DATA(msg->req);
868
- if (TLV_GET_DATA_LEN(msg->req) < sizeof(struct tipc_name_table_query))
880
+ if (TLV_GET_DATA_LEN(msg->req) < (int)sizeof(struct tipc_name_table_query))
869881 return -EINVAL;
870882
871883 depth = ntohl(ntq->depth);
....@@ -894,16 +906,18 @@
894906 if (!attrs[TIPC_NLA_NAME_TABLE])
895907 return -EINVAL;
896908
897
- err = nla_parse_nested(nt, TIPC_NLA_NAME_TABLE_MAX,
898
- attrs[TIPC_NLA_NAME_TABLE], NULL, NULL);
909
+ err = nla_parse_nested_deprecated(nt, TIPC_NLA_NAME_TABLE_MAX,
910
+ attrs[TIPC_NLA_NAME_TABLE], NULL,
911
+ NULL);
899912 if (err)
900913 return err;
901914
902915 if (!nt[TIPC_NLA_NAME_TABLE_PUBL])
903916 return -EINVAL;
904917
905
- err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX,
906
- nt[TIPC_NLA_NAME_TABLE_PUBL], NULL, NULL);
918
+ err = nla_parse_nested_deprecated(publ, TIPC_NLA_PUBL_MAX,
919
+ nt[TIPC_NLA_NAME_TABLE_PUBL], NULL,
920
+ NULL);
907921 if (err)
908922 return err;
909923
....@@ -962,8 +976,8 @@
962976 if (!attrs[TIPC_NLA_PUBL])
963977 return -EINVAL;
964978
965
- err = nla_parse_nested(publ, TIPC_NLA_PUBL_MAX, attrs[TIPC_NLA_PUBL],
966
- NULL, NULL);
979
+ err = nla_parse_nested_deprecated(publ, TIPC_NLA_PUBL_MAX,
980
+ attrs[TIPC_NLA_PUBL], NULL, NULL);
967981 if (err)
968982 return err;
969983
....@@ -998,7 +1012,7 @@
9981012 return -EMSGSIZE;
9991013 }
10001014
1001
- nest = nla_nest_start(args, TIPC_NLA_SOCK);
1015
+ nest = nla_nest_start_noflag(args, TIPC_NLA_SOCK);
10021016 if (!nest) {
10031017 kfree_skb(args);
10041018 return -EMSGSIZE;
....@@ -1032,8 +1046,8 @@
10321046 if (!attrs[TIPC_NLA_SOCK])
10331047 return -EINVAL;
10341048
1035
- err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX, attrs[TIPC_NLA_SOCK],
1036
- NULL, NULL);
1049
+ err = nla_parse_nested_deprecated(sock, TIPC_NLA_SOCK_MAX,
1050
+ attrs[TIPC_NLA_SOCK], NULL, NULL);
10371051 if (err)
10381052 return err;
10391053
....@@ -1044,8 +1058,9 @@
10441058 u32 node;
10451059 struct nlattr *con[TIPC_NLA_CON_MAX + 1];
10461060
1047
- err = nla_parse_nested(con, TIPC_NLA_CON_MAX,
1048
- sock[TIPC_NLA_SOCK_CON], NULL, NULL);
1061
+ err = nla_parse_nested_deprecated(con, TIPC_NLA_CON_MAX,
1062
+ sock[TIPC_NLA_SOCK_CON],
1063
+ NULL, NULL);
10491064
10501065 if (err)
10511066 return err;
....@@ -1084,8 +1099,8 @@
10841099 if (!attrs[TIPC_NLA_MEDIA])
10851100 return -EINVAL;
10861101
1087
- err = nla_parse_nested(media, TIPC_NLA_MEDIA_MAX,
1088
- attrs[TIPC_NLA_MEDIA], NULL, NULL);
1102
+ err = nla_parse_nested_deprecated(media, TIPC_NLA_MEDIA_MAX,
1103
+ attrs[TIPC_NLA_MEDIA], NULL, NULL);
10891104 if (err)
10901105 return err;
10911106
....@@ -1104,8 +1119,8 @@
11041119 if (!attrs[TIPC_NLA_NODE])
11051120 return -EINVAL;
11061121
1107
- err = nla_parse_nested(node, TIPC_NLA_NODE_MAX, attrs[TIPC_NLA_NODE],
1108
- NULL, NULL);
1122
+ err = nla_parse_nested_deprecated(node, TIPC_NLA_NODE_MAX,
1123
+ attrs[TIPC_NLA_NODE], NULL, NULL);
11091124 if (err)
11101125 return err;
11111126
....@@ -1125,7 +1140,7 @@
11251140
11261141 val = ntohl(*(__be32 *)TLV_DATA(msg->req));
11271142
1128
- net = nla_nest_start(skb, TIPC_NLA_NET);
1143
+ net = nla_nest_start_noflag(skb, TIPC_NLA_NET);
11291144 if (!net)
11301145 return -EMSGSIZE;
11311146
....@@ -1151,8 +1166,8 @@
11511166 if (!attrs[TIPC_NLA_NET])
11521167 return -EINVAL;
11531168
1154
- err = nla_parse_nested(net, TIPC_NLA_NET_MAX, attrs[TIPC_NLA_NET],
1155
- NULL, NULL);
1169
+ err = nla_parse_nested_deprecated(net, TIPC_NLA_NET_MAX,
1170
+ attrs[TIPC_NLA_NET], NULL, NULL);
11561171 if (err)
11571172 return err;
11581173
....@@ -1322,9 +1337,10 @@
13221337 return err;
13231338 }
13241339
1325
-static const struct genl_ops tipc_genl_compat_ops[] = {
1340
+static const struct genl_small_ops tipc_genl_compat_ops[] = {
13261341 {
13271342 .cmd = TIPC_GENL_CMD,
1343
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
13281344 .doit = tipc_nl_compat_recv,
13291345 },
13301346 };
....@@ -1336,8 +1352,8 @@
13361352 .maxattr = 0,
13371353 .netnsok = true,
13381354 .module = THIS_MODULE,
1339
- .ops = tipc_genl_compat_ops,
1340
- .n_ops = ARRAY_SIZE(tipc_genl_compat_ops),
1355
+ .small_ops = tipc_genl_compat_ops,
1356
+ .n_small_ops = ARRAY_SIZE(tipc_genl_compat_ops),
13411357 };
13421358
13431359 int __init tipc_netlink_compat_start(void)