jail.c (195011) | jail.c (195870) |
---|---|
1/*- 2 * Copyright (c) 2009 James Gritton. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2009 James Gritton. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/lib/libjail/jail.c 195011 2009-06-25 22:42:19Z jamie $"); | 28__FBSDID("$FreeBSD: head/lib/libjail/jail.c 195870 2009-07-25 14:48:57Z jamie $"); |
29 30#include <sys/param.h> 31#include <sys/types.h> 32#include <sys/jail.h> 33#include <sys/socket.h> 34#include <sys/sysctl.h> 35 36#include <arpa/inet.h> --- 12 unchanged lines hidden (view full) --- 49 50#define JPS_IN_ADDR 1 51#define JPS_IN6_ADDR 2 52 53#define ARRAY_SANITY 5 54#define ARRAY_SLOP 5 55 56 | 29 30#include <sys/param.h> 31#include <sys/types.h> 32#include <sys/jail.h> 33#include <sys/socket.h> 34#include <sys/sysctl.h> 35 36#include <arpa/inet.h> --- 12 unchanged lines hidden (view full) --- 49 50#define JPS_IN_ADDR 1 51#define JPS_IN6_ADDR 2 52 53#define ARRAY_SANITY 5 54#define ARRAY_SLOP 5 55 56 |
57static int jailparam_import_enum(const char **values, int nvalues, 58 const char *valstr, size_t valsize, int *value); |
|
57static int jailparam_vlist(struct jailparam **jpp, va_list ap); 58static int jailparam_type(struct jailparam *jp); 59static char *noname(const char *name); 60static char *nononame(const char *name); 61 62char jail_errmsg[JAIL_ERRMSGLEN]; 63 | 59static int jailparam_vlist(struct jailparam **jpp, va_list ap); 60static int jailparam_type(struct jailparam *jp); 61static char *noname(const char *name); 62static char *nononame(const char *name); 63 64char jail_errmsg[JAIL_ERRMSGLEN]; 65 |
66static const char *bool_values[] = { "false", "true" }; 67static const char *jailsys_values[] = { "disable", "new", "inherit" }; |
|
64 | 68 |
69 |
|
65/* 66 * Import a null-terminated parameter list and set a jail with the flags 67 * and parameters. 68 */ 69int 70jail_setv(int flags, ...) 71{ 72 va_list ap; --- 62 unchanged lines hidden (view full) --- 135 136/* 137 * Return a list of all known parameters. 138 */ 139int 140jailparam_all(struct jailparam **jpp) 141{ 142 struct jailparam *jp; | 70/* 71 * Import a null-terminated parameter list and set a jail with the flags 72 * and parameters. 73 */ 74int 75jail_setv(int flags, ...) 76{ 77 va_list ap; --- 62 unchanged lines hidden (view full) --- 140 141/* 142 * Return a list of all known parameters. 143 */ 144int 145jailparam_all(struct jailparam **jpp) 146{ 147 struct jailparam *jp; |
143 char *nname; | |
144 size_t mlen1, mlen2, buflen; 145 int njp, nlist; 146 int mib1[CTL_MAXNAME], mib2[CTL_MAXNAME - 2]; 147 char buf[MAXPATHLEN]; 148 149 njp = 0; 150 nlist = 32; 151 jp = malloc(nlist * sizeof(*jp)); --- 25 unchanged lines hidden (view full) --- 177 mlen1 = mlen2 / sizeof(int); 178 mib1[1] = 1; 179 buflen = sizeof(buf); 180 if (sysctl(mib1, mlen1 + 2, buf, &buflen, NULL, 0) < 0) { 181 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 182 "sysctl(0.1): %s", strerror(errno)); 183 goto error; 184 } | 148 size_t mlen1, mlen2, buflen; 149 int njp, nlist; 150 int mib1[CTL_MAXNAME], mib2[CTL_MAXNAME - 2]; 151 char buf[MAXPATHLEN]; 152 153 njp = 0; 154 nlist = 32; 155 jp = malloc(nlist * sizeof(*jp)); --- 25 unchanged lines hidden (view full) --- 181 mlen1 = mlen2 / sizeof(int); 182 mib1[1] = 1; 183 buflen = sizeof(buf); 184 if (sysctl(mib1, mlen1 + 2, buf, &buflen, NULL, 0) < 0) { 185 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 186 "sysctl(0.1): %s", strerror(errno)); 187 goto error; 188 } |
189 if (buf[buflen - 2] == '.') 190 buf[buflen - 2] = '\0'; |
|
185 /* Add the parameter to the list */ 186 if (njp >= nlist) { 187 nlist *= 2; 188 jp = realloc(jp, nlist * sizeof(jp)); 189 if (jp == NULL) { 190 jailparam_free(jp, njp); 191 return (-1); 192 } 193 } 194 if (jailparam_init(jp + njp, buf + sizeof(SJPARAM)) < 0) 195 goto error; 196 if (jailparam_type(jp + njp) < 0) { 197 njp++; 198 goto error; 199 } | 191 /* Add the parameter to the list */ 192 if (njp >= nlist) { 193 nlist *= 2; 194 jp = realloc(jp, nlist * sizeof(jp)); 195 if (jp == NULL) { 196 jailparam_free(jp, njp); 197 return (-1); 198 } 199 } 200 if (jailparam_init(jp + njp, buf + sizeof(SJPARAM)) < 0) 201 goto error; 202 if (jailparam_type(jp + njp) < 0) { 203 njp++; 204 goto error; 205 } |
200 /* Convert nobool parameters to bool. */ 201 if (jp[njp].jp_flags & JP_NOBOOL) { 202 nname = nononame(jp[njp].jp_name); 203 if (nname == NULL) { 204 njp++; 205 goto error; 206 } 207 free(jp[njp].jp_name); 208 jp[njp].jp_name = nname; 209 jp[njp].jp_flags ^= JP_BOOL | JP_NOBOOL; 210 } | |
211 mib1[1] = 2; 212 } 213 jp = realloc(jp, njp * sizeof(*jp)); 214 *jpp = jp; 215 return (njp); 216 217 error: 218 jailparam_free(jp, njp); --- 61 unchanged lines hidden (view full) --- 280 return (-1); 281 } 282 avalue = value; 283 for (i = 0; i < nval; i++) { 284 fw = nval == 1 ? strlen(avalue) : strcspn(avalue, ","); 285 switch (jp->jp_ctltype & CTLTYPE) { 286 case CTLTYPE_INT: 287 if (jp->jp_flags & (JP_BOOL | JP_NOBOOL)) { | 206 mib1[1] = 2; 207 } 208 jp = realloc(jp, njp * sizeof(*jp)); 209 *jpp = jp; 210 return (njp); 211 212 error: 213 jailparam_free(jp, njp); --- 61 unchanged lines hidden (view full) --- 275 return (-1); 276 } 277 avalue = value; 278 for (i = 0; i < nval; i++) { 279 fw = nval == 1 ? strlen(avalue) : strcspn(avalue, ","); 280 switch (jp->jp_ctltype & CTLTYPE) { 281 case CTLTYPE_INT: 282 if (jp->jp_flags & (JP_BOOL | JP_NOBOOL)) { |
288 if (!strncasecmp(avalue, "true", 4)) 289 ((int *)jp->jp_value)[i] = 1; 290 else if (!strncasecmp(avalue, "false", 5)) 291 ((int *)jp->jp_value)[i] = 0; 292 else { | 283 if (!jailparam_import_enum(bool_values, 2, 284 avalue, fw, &((int *)jp->jp_value)[i])) { |
293 snprintf(jail_errmsg, | 285 snprintf(jail_errmsg, |
294 JAIL_ERRMSGLEN, 295 "%s: unknown boolean value \"%.*s\"", | 286 JAIL_ERRMSGLEN, "%s: " 287 "unknown boolean value \"%.*s\"", |
296 jp->jp_name, fw, avalue); 297 errno = EINVAL; 298 goto error; 299 } 300 break; 301 } | 288 jp->jp_name, fw, avalue); 289 errno = EINVAL; 290 goto error; 291 } 292 break; 293 } |
294 if (jp->jp_flags & JP_JAILSYS) { 295 /* 296 * Allow setting a jailsys parameter to "new" 297 * in a booleanesque fashion. 298 */ 299 if (value[0] == '\0') 300 ((int *)jp->jp_value)[i] = JAIL_SYS_NEW; 301 else if (!jailparam_import_enum(jailsys_values, 302 sizeof(jailsys_values) / 303 sizeof(jailsys_values[0]), avalue, fw, 304 &((int *)jp->jp_value)[i])) { 305 snprintf(jail_errmsg, 306 JAIL_ERRMSGLEN, "%s: " 307 "unknown jailsys value \"%.*s\"", 308 jp->jp_name, fw, avalue); 309 errno = EINVAL; 310 goto error; 311 } 312 break; 313 } |
|
302 ((int *)jp->jp_value)[i] = strtol(avalue, &ep, 10); 303 integer_test: 304 if (ep != avalue + fw) { 305 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 306 "%s: non-integer value \"%.*s\"", 307 jp->jp_name, fw, avalue); 308 errno = EINVAL; 309 goto error; --- 58 unchanged lines hidden (view full) --- 368 return (0); 369 370 error: 371 free(jp->jp_value); 372 jp->jp_value = NULL; 373 return (-1); 374} 375 | 314 ((int *)jp->jp_value)[i] = strtol(avalue, &ep, 10); 315 integer_test: 316 if (ep != avalue + fw) { 317 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 318 "%s: non-integer value \"%.*s\"", 319 jp->jp_name, fw, avalue); 320 errno = EINVAL; 321 goto error; --- 58 unchanged lines hidden (view full) --- 380 return (0); 381 382 error: 383 free(jp->jp_value); 384 jp->jp_value = NULL; 385 return (-1); 386} 387 |
388static int 389jailparam_import_enum(const char **values, int nvalues, const char *valstr, 390 size_t valsize, int *value) 391{ 392 char *ep; 393 int i; 394 395 for (i = 0; i < nvalues; i++) 396 if (valsize == strlen(values[i]) && 397 !strncasecmp(valstr, values[i], valsize)) { 398 *value = i; 399 return 1; 400 } 401 *value = strtol(valstr, &ep, 10); 402 return (ep == valstr + valsize); 403} 404 |
|
376/* 377 * Put a name and value into a jail parameter element, copying the value 378 * but not altering it. 379 */ 380int 381jailparam_import_raw(struct jailparam *jp, void *value, size_t valuelen) 382{ 383 --- 39 unchanged lines hidden (view full) --- 423 jid = -1; 424 goto done; 425 } 426 jiov[i - 1].iov_base = nname; 427 jiov[i - 1].iov_len = strlen(nname) + 1; 428 429 } 430 } else { | 405/* 406 * Put a name and value into a jail parameter element, copying the value 407 * but not altering it. 408 */ 409int 410jailparam_import_raw(struct jailparam *jp, void *value, size_t valuelen) 411{ 412 --- 39 unchanged lines hidden (view full) --- 452 jid = -1; 453 goto done; 454 } 455 jiov[i - 1].iov_base = nname; 456 jiov[i - 1].iov_len = strlen(nname) + 1; 457 458 } 459 } else { |
460 /* 461 * Try to fill in missing values with an empty string. 462 */ 463 if (jp[j].jp_value == NULL && jp[j].jp_valuelen > 0 && 464 jailparam_import(jp + j, "") < 0) { 465 njp = j; 466 jid = -1; 467 goto done; 468 } |
|
431 jiov[i].iov_base = jp[j].jp_value; 432 jiov[i].iov_len = 433 (jp[j].jp_ctltype & CTLTYPE) == CTLTYPE_STRING 434 ? strlen(jp[j].jp_value) + 1 435 : jp[j].jp_valuelen; 436 } 437 i++; 438 } --- 188 unchanged lines hidden (view full) --- 627/* 628 * Convert a jail parameter's value to external form. 629 */ 630char * 631jailparam_export(struct jailparam *jp) 632{ 633 char *value, *tvalue, **values; 634 size_t valuelen; | 469 jiov[i].iov_base = jp[j].jp_value; 470 jiov[i].iov_len = 471 (jp[j].jp_ctltype & CTLTYPE) == CTLTYPE_STRING 472 ? strlen(jp[j].jp_value) + 1 473 : jp[j].jp_valuelen; 474 } 475 i++; 476 } --- 188 unchanged lines hidden (view full) --- 665/* 666 * Convert a jail parameter's value to external form. 667 */ 668char * 669jailparam_export(struct jailparam *jp) 670{ 671 char *value, *tvalue, **values; 672 size_t valuelen; |
635 int i, nval; | 673 int i, nval, ival; |
636 char valbuf[INET6_ADDRSTRLEN]; 637 638 if (!jp->jp_ctltype && jailparam_type(jp) < 0) 639 return (NULL); 640 if ((jp->jp_ctltype & CTLTYPE) == CTLTYPE_STRING) { 641 value = strdup(jp->jp_value); 642 if (value == NULL) 643 strerror_r(errno, jail_errmsg, JAIL_ERRMSGLEN); --- 6 unchanged lines hidden (view full) --- 650 strerror_r(errno, jail_errmsg, JAIL_ERRMSGLEN); 651 return (value); 652 } 653 values = alloca(nval * sizeof(char *)); 654 valuelen = 0; 655 for (i = 0; i < nval; i++) { 656 switch (jp->jp_ctltype & CTLTYPE) { 657 case CTLTYPE_INT: | 674 char valbuf[INET6_ADDRSTRLEN]; 675 676 if (!jp->jp_ctltype && jailparam_type(jp) < 0) 677 return (NULL); 678 if ((jp->jp_ctltype & CTLTYPE) == CTLTYPE_STRING) { 679 value = strdup(jp->jp_value); 680 if (value == NULL) 681 strerror_r(errno, jail_errmsg, JAIL_ERRMSGLEN); --- 6 unchanged lines hidden (view full) --- 688 strerror_r(errno, jail_errmsg, JAIL_ERRMSGLEN); 689 return (value); 690 } 691 values = alloca(nval * sizeof(char *)); 692 valuelen = 0; 693 for (i = 0; i < nval; i++) { 694 switch (jp->jp_ctltype & CTLTYPE) { 695 case CTLTYPE_INT: |
658 if (jp->jp_flags & (JP_BOOL | JP_NOBOOL)) { 659 strlcpy(valbuf, 660 ((int *)jp->jp_value)[i] ? "true" : "false", | 696 ival = ((int *)jp->jp_value)[i]; 697 if ((jp->jp_flags & (JP_BOOL | JP_NOBOOL)) && 698 (unsigned)ival < 2) { 699 strlcpy(valbuf, bool_values[ival], |
661 sizeof(valbuf)); 662 break; 663 } | 700 sizeof(valbuf)); 701 break; 702 } |
664 snprintf(valbuf, sizeof(valbuf), "%d", 665 ((int *)jp->jp_value)[i]); | 703 if ((jp->jp_flags & JP_JAILSYS) && 704 (unsigned)ival < sizeof(jailsys_values) / 705 sizeof(jailsys_values[0])) { 706 strlcpy(valbuf, jailsys_values[ival], 707 sizeof(valbuf)); 708 break; 709 } 710 snprintf(valbuf, sizeof(valbuf), "%d", ival); |
666 break; 667 case CTLTYPE_UINT: 668 snprintf(valbuf, sizeof(valbuf), "%u", 669 ((unsigned *)jp->jp_value)[i]); 670 break; 671 case CTLTYPE_LONG: 672 snprintf(valbuf, sizeof(valbuf), "%ld", 673 ((long *)jp->jp_value)[i]); --- 9 unchanged lines hidden (view full) --- 683 case CTLTYPE_STRUCT: 684 switch (jp->jp_structtype) { 685 case JPS_IN_ADDR: 686 if (inet_ntop(AF_INET, 687 &((struct in_addr *)jp->jp_value)[i], 688 valbuf, sizeof(valbuf)) == NULL) { 689 strerror_r(errno, jail_errmsg, 690 JAIL_ERRMSGLEN); | 711 break; 712 case CTLTYPE_UINT: 713 snprintf(valbuf, sizeof(valbuf), "%u", 714 ((unsigned *)jp->jp_value)[i]); 715 break; 716 case CTLTYPE_LONG: 717 snprintf(valbuf, sizeof(valbuf), "%ld", 718 ((long *)jp->jp_value)[i]); --- 9 unchanged lines hidden (view full) --- 728 case CTLTYPE_STRUCT: 729 switch (jp->jp_structtype) { 730 case JPS_IN_ADDR: 731 if (inet_ntop(AF_INET, 732 &((struct in_addr *)jp->jp_value)[i], 733 valbuf, sizeof(valbuf)) == NULL) { 734 strerror_r(errno, jail_errmsg, 735 JAIL_ERRMSGLEN); |
691 | 736 |
692 return (NULL); 693 } 694 break; 695 case JPS_IN6_ADDR: 696 if (inet_ntop(AF_INET6, 697 &((struct in6_addr *)jp->jp_value)[i], 698 valbuf, sizeof(valbuf)) == NULL) { 699 strerror_r(errno, jail_errmsg, 700 JAIL_ERRMSGLEN); | 737 return (NULL); 738 } 739 break; 740 case JPS_IN6_ADDR: 741 if (inet_ntop(AF_INET6, 742 &((struct in6_addr *)jp->jp_value)[i], 743 valbuf, sizeof(valbuf)) == NULL) { 744 strerror_r(errno, jail_errmsg, 745 JAIL_ERRMSGLEN); |
701 | 746 |
702 return (NULL); 703 } 704 break; 705 default: 706 goto unknown_type; 707 } 708 break; 709 default: --- 131 unchanged lines hidden (view full) --- 841 desc.s[0] == 'B') { 842 jp->jp_ctltype = desc.i; 843 jp->jp_flags |= JP_NOBOOL; 844 jp->jp_valuelen = sizeof(int); 845 return (0); 846 } 847 } 848 } | 747 return (NULL); 748 } 749 break; 750 default: 751 goto unknown_type; 752 } 753 break; 754 default: --- 131 unchanged lines hidden (view full) --- 886 desc.s[0] == 'B') { 887 jp->jp_ctltype = desc.i; 888 jp->jp_flags |= JP_NOBOOL; 889 jp->jp_valuelen = sizeof(int); 890 return (0); 891 } 892 } 893 } |
894 unknown_parameter: |
|
849 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 850 "unknown parameter: %s", jp->jp_name); 851 errno = ENOENT; 852 return (-1); 853 } | 895 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 896 "unknown parameter: %s", jp->jp_name); 897 errno = ENOENT; 898 return (-1); 899 } |
900 mib_desc: |
|
854 mib[1] = 4; 855 desclen = sizeof(desc); 856 if (sysctl(mib, (miblen / sizeof(int)) + 2, &desc, &desclen, 857 NULL, 0) < 0) { 858 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 859 "sysctl(0.4.%s): %s", jp->jp_name, strerror(errno)); 860 return (-1); 861 } --- 6 unchanged lines hidden (view full) --- 868 isarray = 1; 869 p[-2] = 0; 870 } 871 /* Look for types we understand */ 872 jp->jp_ctltype = desc.i; 873 switch (desc.i & CTLTYPE) { 874 case CTLTYPE_INT: 875 if (desc.s[0] == 'B') | 901 mib[1] = 4; 902 desclen = sizeof(desc); 903 if (sysctl(mib, (miblen / sizeof(int)) + 2, &desc, &desclen, 904 NULL, 0) < 0) { 905 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 906 "sysctl(0.4.%s): %s", jp->jp_name, strerror(errno)); 907 return (-1); 908 } --- 6 unchanged lines hidden (view full) --- 915 isarray = 1; 916 p[-2] = 0; 917 } 918 /* Look for types we understand */ 919 jp->jp_ctltype = desc.i; 920 switch (desc.i & CTLTYPE) { 921 case CTLTYPE_INT: 922 if (desc.s[0] == 'B') |
876 jp->jp_flags |= 877 (desc.s[1] == 'N') ? JP_NOBOOL : JP_BOOL; | 923 jp->jp_flags |= JP_BOOL; 924 else if (!strcmp(desc.s, "E,jailsys")) 925 jp->jp_flags |= JP_JAILSYS; |
878 case CTLTYPE_UINT: 879 jp->jp_valuelen = sizeof(int); 880 break; 881 case CTLTYPE_LONG: 882 case CTLTYPE_ULONG: 883 jp->jp_valuelen = sizeof(long); 884 break; 885 case CTLTYPE_QUAD: --- 25 unchanged lines hidden (view full) --- 911 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 912 "sysctl(" SJPARAM ".%s): %s", jp->jp_name, 913 strerror(errno)); 914 return (-1); 915 } 916 } 917 break; 918 case CTLTYPE_NODE: | 926 case CTLTYPE_UINT: 927 jp->jp_valuelen = sizeof(int); 928 break; 929 case CTLTYPE_LONG: 930 case CTLTYPE_ULONG: 931 jp->jp_valuelen = sizeof(long); 932 break; 933 case CTLTYPE_QUAD: --- 25 unchanged lines hidden (view full) --- 959 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 960 "sysctl(" SJPARAM ".%s): %s", jp->jp_name, 961 strerror(errno)); 962 return (-1); 963 } 964 } 965 break; 966 case CTLTYPE_NODE: |
919 /* 920 * A node isn't normally a parameter, but may be a boolean 921 * if its "no" counterpart exists. 922 */ 923 nname = noname(jp->jp_name); 924 if (nname == NULL) 925 return (-1); 926 mib[1] = 3; 927 snprintf(desc.s, sizeof(desc.s), SJPARAM ".%s", nname); 928 free(nname); 929 miblen = sizeof(mib) - 2 * sizeof(int); 930 if (sysctl(mib, 2, mib + 2, &miblen, desc.s, 931 strlen(desc.s)) < 0) { 932 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 933 "unknown parameter: %s", jp->jp_name); 934 return (-1); 935 } 936 mib[1] = 4; 937 desclen = sizeof(desc); 938 if (sysctl(mib, (miblen / sizeof(int)) + 2, &desc, &desclen, | 967 /* A node might be described by an empty-named child. */ 968 mib[1] = 1; 969 mib[(miblen / sizeof(int)) + 2] = 970 mib[(miblen / sizeof(int)) + 1] - 1; 971 miblen += sizeof(int); 972 desclen = sizeof(desc.s); 973 if (sysctl(mib, (miblen / sizeof(int)) + 2, desc.s, &desclen, |
939 NULL, 0) < 0) { 940 snprintf(jail_errmsg, JAIL_ERRMSGLEN, | 974 NULL, 0) < 0) { 975 snprintf(jail_errmsg, JAIL_ERRMSGLEN, |
941 "sysctl(0.4.%s): %s", desc.s, strerror(errno)); | 976 "sysctl(0.1): %s", strerror(errno)); |
942 return (-1); 943 } | 977 return (-1); 978 } |
944 if ((desc.i & CTLTYPE) != CTLTYPE_INT || desc.s[0] != 'B') { 945 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 946 "unknown parameter: %s", jp->jp_name); 947 errno = ENOENT; 948 return (-1); 949 } 950 jp->jp_valuelen = sizeof(int); 951 jp->jp_ctltype = desc.i; 952 jp->jp_flags |= JP_BOOL; 953 break; | 979 if (desc.s[desclen - 2] != '.') 980 goto unknown_parameter; 981 goto mib_desc; |
954 default: 955 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 956 "unknown type for %s", jp->jp_name); 957 errno = ENOENT; 958 return (-1); 959 } 960 if (isarray) { 961 jp->jp_elemlen = jp->jp_valuelen; --- 49 unchanged lines hidden --- | 982 default: 983 snprintf(jail_errmsg, JAIL_ERRMSGLEN, 984 "unknown type for %s", jp->jp_name); 985 errno = ENOENT; 986 return (-1); 987 } 988 if (isarray) { 989 jp->jp_elemlen = jp->jp_valuelen; --- 49 unchanged lines hidden --- |