| 2499 | } |
| 2500 | |
| 2501 | static int |
| 2502 | nvs_embedded_nvl_array(nvstream_t *nvs, nvpair_t *nvp, size_t *size) |
| 2503 | { |
| 2504 | size_t nelem = NVP_NELEM(nvp); |
| 2505 | nvlist_t **nvlp = EMBEDDED_NVL_ARRAY(nvp); |
| 2506 | int i; |
| 2507 | |
| 2508 | switch (nvs->nvs_op) { |
| 2509 | case NVS_OP_ENCODE: |
| 2510 | for (i = 0; i < nelem; i++) |
| 2511 | if (nvs_embedded(nvs, nvlp[i]) != 0) |
| 2512 | return (EFAULT); |
| 2513 | break; |
| 2514 | |
| 2515 | case NVS_OP_DECODE: { |
| 2516 | size_t len = nelem * sizeof (uint64_t); |
| 2517 | nvlist_t *embedded = (nvlist_t *)((uintptr_t)nvlp + len); |
| 2518 | |
| 2519 | bzero(nvlp, len); /* don't trust packed data */ |
| 2520 | for (i = 0; i < nelem; i++) { |
| 2521 | if (nvs_embedded(nvs, embedded) != 0) { |
| 2522 | nvpair_free(nvp); |
| 2523 | return (EFAULT); |
| 2524 | } |
| 2525 | |
| 2526 | nvlp[i] = embedded++; |
| 2527 | } |
| 2528 | break; |
| 2529 | } |
| 2530 | case NVS_OP_GETSIZE: { |
| 2531 | uint64_t nvsize = 0; |
| 2532 | |
| 2533 | for (i = 0; i < nelem; i++) { |
| 2534 | size_t nvp_sz = 0; |
| 2535 | |
| 2536 | if (nvs_operation(nvs, nvlp[i], &nvp_sz) != 0) |
| 2537 | return (EINVAL); |
| 2538 | |
| 2539 | if ((nvsize += nvp_sz) > INT32_MAX) |
| 2540 | return (EINVAL); |
| 2541 | } |
| 2542 | |
| 2543 | *size = nvsize; |
| 2544 | break; |
| 2545 | } |
| 2546 | default: |
| 2547 | return (EINVAL); |
| 2548 | } |
| 2549 | |
| 2550 | return (0); |
| 2551 | } |
| 2552 | |
| 2553 | static int nvs_native(nvstream_t *, nvlist_t *, char *, size_t *); |
| 2554 | static int nvs_xdr(nvstream_t *, nvlist_t *, char *, size_t *); |
no test coverage detected