X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/ff6e181ae92fc6f1e89841290f461d1f2f9badd9..b0d623f7f2ae71ed96e60569f61f9a9a27016e80:/pexpert/gen/bootargs.c diff --git a/pexpert/gen/bootargs.c b/pexpert/gen/bootargs.c index f49fb4c12..4c5b5f07d 100644 --- a/pexpert/gen/bootargs.c +++ b/pexpert/gen/bootargs.c @@ -1,14 +1,19 @@ /* - * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2008 Apple Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER @@ -18,7 +23,7 @@ * Please see the License for the specific language governing rights and * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #include @@ -26,16 +31,27 @@ extern boolean_t isargsep( char c); extern int argstrcpy(char *from, char *to); extern int getval(char *s, int *val); +static int argstrcpy2(char *from,char *to, unsigned maxlen); + #define NUM 0 #define STR 1 +#if !defined(__LP64__) && !defined(__arm__) boolean_t PE_parse_boot_arg( const char *arg_string, void *arg_ptr) { - return PE_parse_boot_argn(arg_string, arg_ptr, -1); + int max_len = -1; + +#if CONFIG_EMBEDDED + /* Limit arg size to 4 byte when no size is given */ + max_len = 4; +#endif + + return PE_parse_boot_argn(arg_string, arg_ptr, max_len); } +#endif boolean_t PE_parse_boot_argn( @@ -45,7 +61,7 @@ PE_parse_boot_argn( { char *args; char *cp, c; - int i; + unsigned int i; int val; boolean_t arg_boolean; boolean_t arg_found; @@ -55,7 +71,7 @@ PE_parse_boot_argn( arg_found = FALSE; - while(isargsep(*args)) args++; + while(*args && isargsep(*args)) args++; while (*args) { @@ -81,7 +97,7 @@ PE_parse_boot_argn( arg_found = TRUE; break; } else { - while (isargsep (*cp)) + while (*cp && isargsep (*cp)) cp++; if (*cp == '=' && c != '=') { args = cp+1; @@ -89,8 +105,8 @@ PE_parse_boot_argn( } if ('_' == *arg_string) /* Force a string copy if the argument name begins with an underscore */ { - int hacklen = 16 > max_len ? 16 : max_len; - argstrcpy2 (++cp, (char *)arg_ptr, hacklen); /* Hack - terminate after 16 characters */ + int hacklen = 17 > max_len ? 17 : max_len; + argstrcpy2 (++cp, (char *)arg_ptr, hacklen - 1); /* Hack - terminate after 16 characters */ arg_found = TRUE; break; } @@ -102,7 +118,7 @@ PE_parse_boot_argn( break; case STR: if(max_len > 0) //max_len of 0 performs no copy at all - argstrcpy2(++cp, (char *)arg_ptr, max_len); + argstrcpy2(++cp, (char *)arg_ptr, max_len - 1); else if(max_len == -1) argstrcpy(++cp, (char *)arg_ptr); arg_found = TRUE; @@ -145,13 +161,13 @@ argstrcpy( return(i); } -int +static int argstrcpy2( char *from, char *to, unsigned maxlen) { - int i = 0; + unsigned int i = 0; while (!isargsep(*from) && i < maxlen) { i++; @@ -166,8 +182,8 @@ getval( char *s, int *val) { - register unsigned radix, intval; - register unsigned char c; + unsigned int radix, intval; + unsigned char c; int sign = 1; if (*s == '=') { @@ -176,7 +192,7 @@ getval( sign = -1, s++; intval = *s++-'0'; radix = 10; - if (intval == 0) + if (intval == 0) { switch(*s) { case 'x': @@ -200,28 +216,44 @@ getval( if (!isargsep(*s)) return (STR); } + } else if (intval >= radix) { + return (STR); + } for(;;) { - if (((c = *s++) >= '0') && (c <= '9')) + c = *s++; + if (isargsep(c)) + break; + if ((radix <= 10) && + ((c >= '0') && (c <= ('9' - (10 - radix))))) { + c -= '0'; + } else if ((radix == 16) && + ((c >= '0') && (c <= '9'))) { c -= '0'; - else if ((c >= 'a') && (c <= 'f')) + } else if ((radix == 16) && + ((c >= 'a') && (c <= 'f'))) { c -= 'a' - 10; - else if ((c >= 'A') && (c <= 'F')) + } else if ((radix == 16) && + ((c >= 'A') && (c <= 'F'))) { c -= 'A' - 10; - else if (c == 'k' || c == 'K') - { sign *= 1024; break; } - else if (c == 'm' || c == 'M') - { sign *= 1024 * 1024; break; } - else if (c == 'g' || c == 'G') - { sign *= 1024 * 1024 * 1024; break; } - else if (isargsep(c)) + } else if (c == 'k' || c == 'K') { + sign *= 1024; break; - else + } else if (c == 'm' || c == 'M') { + sign *= 1024 * 1024; + break; + } else if (c == 'g' || c == 'G') { + sign *= 1024 * 1024 * 1024; + break; + } else { return (STR); + } if (c >= radix) return (STR); intval *= radix; intval += c; } + if (!isargsep(c) && !isargsep(*s)) + return STR; *val = intval * sign; return (NUM); }