1 /* 2 * NETLINK Netlink attributes 3 * 4 * Authors: Thomas Graf <tgraf@suug.ch> 5 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> 6 */ 7 8 #include <linux/export.h> 9 #include <linux/kernel.h> 10 #include <linux/errno.h> 11 #include <linux/jiffies.h> 12 #include <linux/netdevice.h> 13 #include <linux/skbuff.h> 14 #include <linux/string.h> 15 #include <linux/types.h> 16 #include <net/netlink.h> 17 18 static const u16 nla_attr_minlen[NLA_TYPE_MAX+1] = { 19 [NLA_U8] = sizeof(u8), 20 [NLA_U16] = sizeof(u16), 21 [NLA_U32] = sizeof(u32), 22 [NLA_U64] = sizeof(u64), 23 [NLA_MSECS] = sizeof(u64), 24 [NLA_NESTED] = NLA_HDRLEN, 25 [NLA_S8] = sizeof(s8), 26 [NLA_S16] = sizeof(s16), 27 [NLA_S32] = sizeof(s32), 28 [NLA_S64] = sizeof(s64), 29 }; 30 31 static int validate_nla(const struct nlattr *nla, int maxtype, 32 const struct nla_policy *policy) 33 { 34 const struct nla_policy *pt; 35 int minlen = 0, attrlen = nla_len(nla), type = nla_type(nla); 36 37 if (type <= 0 || type > maxtype) 38 return 0; 39 40 pt = &policy[type]; 41 42 BUG_ON(pt->type > NLA_TYPE_MAX); 43 44 switch (pt->type) { 45 case NLA_FLAG: 46 if (attrlen > 0) 47 return -ERANGE; 48 break; 49 50 case NLA_NUL_STRING: 51 if (pt->len) 52 minlen = min_t(int, attrlen, pt->len + 1); 53 else 54 minlen = attrlen; 55 56 if (!minlen || memchr(nla_data(nla), '\0', minlen) == NULL) 57 return -EINVAL; 58 /* fall through */ 59 60 case NLA_STRING: 61 if (attrlen < 1) 62 return -ERANGE; 63 64 if (pt->len) { 65 char *buf = nla_data(nla); 66 67 if (buf[attrlen - 1] == '\0') 68 attrlen--; 69 70 if (attrlen > pt->len) 71 return -ERANGE; 72 } 73 break; 74 75 case NLA_BINARY: 76 if (pt->len && attrlen > pt->len) 77 return -ERANGE; 78 break; 79 80 case NLA_NESTED_COMPAT: 81 if (attrlen < pt->len) 82 return -ERANGE; 83 if (attrlen < NLA_ALIGN(pt->len)) 84 break; 85 if (attrlen < NLA_ALIGN(pt->len) + NLA_HDRLEN) 86 return -ERANGE; 87 nla = nla_data(nla) + NLA_ALIGN(pt->len); 88 if (attrlen < NLA_ALIGN(pt->len) + NLA_HDRLEN + nla_len(nla)) 89 return -ERANGE; 90 break; 91 case NLA_NESTED: 92 /* a nested attributes is allowed to be empty; if its not, 93 * it must have a size of at least NLA_HDRLEN. 94 */ 95 if (attrlen == 0) 96 break; 97 default: 98 if (pt->len) 99 minlen = pt->len; 100 else if (pt->type != NLA_UNSPEC) 101 minlen = nla_attr_minlen[pt->type]; 102 103 if (attrlen < minlen) 104 return -ERANGE; 105 } 106 107 return 0; 108 } 109 110 /** 111 * nla_validate - Validate a stream of attributes 112 * @head: head of attribute stream 113 * @len: length of attribute stream 114 * @maxtype: maximum attribute type to be expected 115 * @policy: validation policy 116 * 117 * Validates all attributes in the specified attribute stream against the 118 * specified policy. Attributes with a type exceeding maxtype will be 119 * ignored. See documenation of struct nla_policy for more details. 120 * 121 * Returns 0 on success or a negative error code. 122 */ 123 int nla_validate(const struct nlattr *head, int len, int maxtype, 124 const struct nla_policy *policy) 125 { 126 const struct nlattr *nla; 127 int rem, err; 128 129 nla_for_each_attr(nla, head, len, rem) { 130 err = validate_nla(nla, maxtype, policy); 131 if (err < 0) 132 goto errout; 133 } 134 135 err = 0; 136 errout: 137 return err; 138 } 139 EXPORT_SYMBOL(nla_validate); 140 141 /** 142 * nla_policy_len - Determin the max. length of a policy 143 * @policy: policy to use 144 * @n: number of policies 145 * 146 * Determines the max. length of the policy. It is currently used 147 * to allocated Netlink buffers roughly the size of the actual 148 * message. 149 * 150 * Returns 0 on success or a negative error code. 151 */ 152 int 153 nla_policy_len(const struct nla_policy *p, int n) 154 { 155 int i, len = 0; 156 157 for (i = 0; i < n; i++, p++) { 158 if (p->len) 159 len += nla_total_size(p->len); 160 else if (nla_attr_minlen[p->type]) 161 len += nla_total_size(nla_attr_minlen[p->type]); 162 } 163 164 return len; 165 } 166 EXPORT_SYMBOL(nla_policy_len); 167 168 /** 169 * nla_parse - Parse a stream of attributes into a tb buffer 170 * @tb: destination array with maxtype+1 elements 171 * @maxtype: maximum attribute type to be expected 172 * @head: head of attribute stream 173 * @len: length of attribute stream 174 * @policy: validation policy 175 * 176 * Parses a stream of attributes and stores a pointer to each attribute in 177 * the tb array accessible via the attribute type. Attributes with a type 178 * exceeding maxtype will be silently ignored for backwards compatibility 179 * reasons. policy may be set to NULL if no validation is required. 180 * 181 * Returns 0 on success or a negative error code. 182 */ 183 int nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head, 184 int len, const struct nla_policy *policy) 185 { 186 const struct nlattr *nla; 187 int rem, err; 188 189 memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1)); 190 191 nla_for_each_attr(nla, head, len, rem) { 192 u16 type = nla_type(nla); 193 194 if (type > 0 && type <= maxtype) { 195 if (policy) { 196 err = validate_nla(nla, maxtype, policy); 197 if (err < 0) 198 goto errout; 199 } 200 201 tb[type] = (struct nlattr *)nla; 202 } 203 } 204 205 if (unlikely(rem > 0)) 206 pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n", 207 rem, current->comm); 208 209 err = 0; 210 errout: 211 return err; 212 } 213 EXPORT_SYMBOL(nla_parse); 214 215 /** 216 * nla_find - Find a specific attribute in a stream of attributes 217 * @head: head of attribute stream 218 * @len: length of attribute stream 219 * @attrtype: type of attribute to look for 220 * 221 * Returns the first attribute in the stream matching the specified type. 222 */ 223 struct nlattr *nla_find(const struct nlattr *head, int len, int attrtype) 224 { 225 const struct nlattr *nla; 226 int rem; 227 228 nla_for_each_attr(nla, head, len, rem) 229 if (nla_type(nla) == attrtype) 230 return (struct nlattr *)nla; 231 232 return NULL; 233 } 234 EXPORT_SYMBOL(nla_find); 235 236 /** 237 * nla_strlcpy - Copy string attribute payload into a sized buffer 238 * @dst: where to copy the string to 239 * @nla: attribute to copy the string from 240 * @dstsize: size of destination buffer 241 * 242 * Copies at most dstsize - 1 bytes into the destination buffer. 243 * The result is always a valid NUL-terminated string. Unlike 244 * strlcpy the destination buffer is always padded out. 245 * 246 * Returns the length of the source buffer. 247 */ 248 size_t nla_strlcpy(char *dst, const struct nlattr *nla, size_t dstsize) 249 { 250 size_t srclen = nla_len(nla); 251 char *src = nla_data(nla); 252 253 if (srclen > 0 && src[srclen - 1] == '\0') 254 srclen--; 255 256 if (dstsize > 0) { 257 size_t len = (srclen >= dstsize) ? dstsize - 1 : srclen; 258 259 memset(dst, 0, dstsize); 260 memcpy(dst, src, len); 261 } 262 263 return srclen; 264 } 265 EXPORT_SYMBOL(nla_strlcpy); 266 267 /** 268 * nla_memcpy - Copy a netlink attribute into another memory area 269 * @dest: where to copy to memcpy 270 * @src: netlink attribute to copy from 271 * @count: size of the destination area 272 * 273 * Note: The number of bytes copied is limited by the length of 274 * attribute's payload. memcpy 275 * 276 * Returns the number of bytes copied. 277 */ 278 int nla_memcpy(void *dest, const struct nlattr *src, int count) 279 { 280 int minlen = min_t(int, count, nla_len(src)); 281 282 memcpy(dest, nla_data(src), minlen); 283 284 return minlen; 285 } 286 EXPORT_SYMBOL(nla_memcpy); 287 288 /** 289 * nla_memcmp - Compare an attribute with sized memory area 290 * @nla: netlink attribute 291 * @data: memory area 292 * @size: size of memory area 293 */ 294 int nla_memcmp(const struct nlattr *nla, const void *data, 295 size_t size) 296 { 297 int d = nla_len(nla) - size; 298 299 if (d == 0) 300 d = memcmp(nla_data(nla), data, size); 301 302 return d; 303 } 304 EXPORT_SYMBOL(nla_memcmp); 305 306 /** 307 * nla_strcmp - Compare a string attribute against a string 308 * @nla: netlink string attribute 309 * @str: another string 310 */ 311 int nla_strcmp(const struct nlattr *nla, const char *str) 312 { 313 int len = strlen(str); 314 char *buf = nla_data(nla); 315 int attrlen = nla_len(nla); 316 int d; 317 318 if (attrlen > 0 && buf[attrlen - 1] == '\0') 319 attrlen--; 320 321 d = attrlen - len; 322 if (d == 0) 323 d = memcmp(nla_data(nla), str, len); 324 325 return d; 326 } 327 EXPORT_SYMBOL(nla_strcmp); 328 329 #ifdef CONFIG_NET 330 /** 331 * __nla_reserve - reserve room for attribute on the skb 332 * @skb: socket buffer to reserve room on 333 * @attrtype: attribute type 334 * @attrlen: length of attribute payload 335 * 336 * Adds a netlink attribute header to a socket buffer and reserves 337 * room for the payload but does not copy it. 338 * 339 * The caller is responsible to ensure that the skb provides enough 340 * tailroom for the attribute header and payload. 341 */ 342 struct nlattr *__nla_reserve(struct sk_buff *skb, int attrtype, int attrlen) 343 { 344 struct nlattr *nla; 345 346 nla = (struct nlattr *) skb_put(skb, nla_total_size(attrlen)); 347 nla->nla_type = attrtype; 348 nla->nla_len = nla_attr_size(attrlen); 349 350 memset((unsigned char *) nla + nla->nla_len, 0, nla_padlen(attrlen)); 351 352 return nla; 353 } 354 EXPORT_SYMBOL(__nla_reserve); 355 356 /** 357 * __nla_reserve_nohdr - reserve room for attribute without header 358 * @skb: socket buffer to reserve room on 359 * @attrlen: length of attribute payload 360 * 361 * Reserves room for attribute payload without a header. 362 * 363 * The caller is responsible to ensure that the skb provides enough 364 * tailroom for the payload. 365 */ 366 void *__nla_reserve_nohdr(struct sk_buff *skb, int attrlen) 367 { 368 void *start; 369 370 start = skb_put(skb, NLA_ALIGN(attrlen)); 371 memset(start, 0, NLA_ALIGN(attrlen)); 372 373 return start; 374 } 375 EXPORT_SYMBOL(__nla_reserve_nohdr); 376 377 /** 378 * nla_reserve - reserve room for attribute on the skb 379 * @skb: socket buffer to reserve room on 380 * @attrtype: attribute type 381 * @attrlen: length of attribute payload 382 * 383 * Adds a netlink attribute header to a socket buffer and reserves 384 * room for the payload but does not copy it. 385 * 386 * Returns NULL if the tailroom of the skb is insufficient to store 387 * the attribute header and payload. 388 */ 389 struct nlattr *nla_reserve(struct sk_buff *skb, int attrtype, int attrlen) 390 { 391 if (unlikely(skb_tailroom(skb) < nla_total_size(attrlen))) 392 return NULL; 393 394 return __nla_reserve(skb, attrtype, attrlen); 395 } 396 EXPORT_SYMBOL(nla_reserve); 397 398 /** 399 * nla_reserve_nohdr - reserve room for attribute without header 400 * @skb: socket buffer to reserve room on 401 * @attrlen: length of attribute payload 402 * 403 * Reserves room for attribute payload without a header. 404 * 405 * Returns NULL if the tailroom of the skb is insufficient to store 406 * the attribute payload. 407 */ 408 void *nla_reserve_nohdr(struct sk_buff *skb, int attrlen) 409 { 410 if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen))) 411 return NULL; 412 413 return __nla_reserve_nohdr(skb, attrlen); 414 } 415 EXPORT_SYMBOL(nla_reserve_nohdr); 416 417 /** 418 * __nla_put - Add a netlink attribute to a socket buffer 419 * @skb: socket buffer to add attribute to 420 * @attrtype: attribute type 421 * @attrlen: length of attribute payload 422 * @data: head of attribute payload 423 * 424 * The caller is responsible to ensure that the skb provides enough 425 * tailroom for the attribute header and payload. 426 */ 427 void __nla_put(struct sk_buff *skb, int attrtype, int attrlen, 428 const void *data) 429 { 430 struct nlattr *nla; 431 432 nla = __nla_reserve(skb, attrtype, attrlen); 433 memcpy(nla_data(nla), data, attrlen); 434 } 435 EXPORT_SYMBOL(__nla_put); 436 437 /** 438 * __nla_put_nohdr - Add a netlink attribute without header 439 * @skb: socket buffer to add attribute to 440 * @attrlen: length of attribute payload 441 * @data: head of attribute payload 442 * 443 * The caller is responsible to ensure that the skb provides enough 444 * tailroom for the attribute payload. 445 */ 446 void __nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data) 447 { 448 void *start; 449 450 start = __nla_reserve_nohdr(skb, attrlen); 451 memcpy(start, data, attrlen); 452 } 453 EXPORT_SYMBOL(__nla_put_nohdr); 454 455 /** 456 * nla_put - Add a netlink attribute to a socket buffer 457 * @skb: socket buffer to add attribute to 458 * @attrtype: attribute type 459 * @attrlen: length of attribute payload 460 * @data: head of attribute payload 461 * 462 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store 463 * the attribute header and payload. 464 */ 465 int nla_put(struct sk_buff *skb, int attrtype, int attrlen, const void *data) 466 { 467 if (unlikely(skb_tailroom(skb) < nla_total_size(attrlen))) 468 return -EMSGSIZE; 469 470 __nla_put(skb, attrtype, attrlen, data); 471 return 0; 472 } 473 EXPORT_SYMBOL(nla_put); 474 475 /** 476 * nla_put_nohdr - Add a netlink attribute without header 477 * @skb: socket buffer to add attribute to 478 * @attrlen: length of attribute payload 479 * @data: head of attribute payload 480 * 481 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store 482 * the attribute payload. 483 */ 484 int nla_put_nohdr(struct sk_buff *skb, int attrlen, const void *data) 485 { 486 if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen))) 487 return -EMSGSIZE; 488 489 __nla_put_nohdr(skb, attrlen, data); 490 return 0; 491 } 492 EXPORT_SYMBOL(nla_put_nohdr); 493 494 /** 495 * nla_append - Add a netlink attribute without header or padding 496 * @skb: socket buffer to add attribute to 497 * @attrlen: length of attribute payload 498 * @data: head of attribute payload 499 * 500 * Returns -EMSGSIZE if the tailroom of the skb is insufficient to store 501 * the attribute payload. 502 */ 503 int nla_append(struct sk_buff *skb, int attrlen, const void *data) 504 { 505 if (unlikely(skb_tailroom(skb) < NLA_ALIGN(attrlen))) 506 return -EMSGSIZE; 507 508 memcpy(skb_put(skb, attrlen), data, attrlen); 509 return 0; 510 } 511 EXPORT_SYMBOL(nla_append); 512 #endif 513