On Tue, 15 May 2007 05:24:06 -0700 "Paul Cochrane via RT" <[EMAIL PROTECTED]> wrote:
> On 14/05/07, via RT Mike Mattie <[EMAIL PROTECTED]> > wrote: > > # New Ticket Created by Mike Mattie > > # Please include the string: [perl #42947] > > # in the subject line of all future correspondence about this issue. > > # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=42947 > > > > > > > Hello, > > > > This patch changes the Parrot_get_runtime_prefix API from > > > > char* Parrot_get_runtime_prefix(Interp *interp, STRING **prefix_str) > > > > to > > > > STRING* Parrot_get_runtime_prefix (Interp *interp ) { > > > > This is done to make the routine safer, it no longer can leak > > memory. Also the useless "." paths are removed from src/library.c. > > some minor changes to Parrot_locate_runtime_file_str are present to > > sync and correct that function. > > > > other callers in src/inter_misc.c , and compilers/imcc/main.c are > > fixed as well. > > > > also a case of a bare free() being used instead of the proper > > mem_sys_free is fixed. > > > > This relies on #42944 to apply. > > > > Cheers, > > Mike Mattie - [EMAIL PROTECTED] > > > > > > Mike, my mistake. this should go through now that I have attached it :) > It seems the patch didn't come through with the email, could you send > it again? > > Paul > >
--- HEAD/src/library.c 2007-05-14 07:00:17.000000000 -0700 +++ path-api/src/library.c 2007-05-14 06:14:04.000000000 -0700 @@ -76,8 +76,6 @@ VTABLE_push_string(interp, paths, entry); entry = CONST_STRING(interp, "runtime/parrot/"); VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "./"); - VTABLE_push_string(interp, paths, entry); entry = CONST_STRING(interp, "lib/parrot/include/"); VTABLE_push_string(interp, paths, entry); entry = CONST_STRING(interp, "lib/parrot/"); @@ -91,8 +89,6 @@ VTABLE_push_string(interp, paths, entry); entry = CONST_STRING(interp, "runtime/parrot/"); VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "./"); - VTABLE_push_string(interp, paths, entry); entry = CONST_STRING(interp, "lib/parrot/library/"); VTABLE_push_string(interp, paths, entry); entry = CONST_STRING(interp, "lib/parrot/"); @@ -260,12 +256,14 @@ else paths = get_search_paths(interp, PARROT_LIB_PATH_INCLUDE); - Parrot_get_runtime_prefix(interp, &prefix); + prefix = Parrot_get_runtime_prefix(interp); + n = VTABLE_elements(interp, paths); for (i = 0; i < n; ++i) { path = VTABLE_get_string_keyed_int(interp, paths, i); - if (string_length(interp, prefix) && - !parrot_path_is_abs(interp,path)) { + if (prefix + && string_length(interp,prefix) + && !parrot_path_is_abs(interp,path)) { full_name = parrot_path_concat(interp, prefix , path); } else @@ -281,7 +279,22 @@ return full_name; } - full_name = ( type & PARROT_RUNTIME_FT_DYNEXT ) + if (prefix && string_length(interp,prefix)) { + /* try this after the built-in paths to avoid security + issues with the default "." being used before builtin + paths */ + + full_name = parrot_path_concat(interp, prefix , file); + + full_name = ( type & PARROT_RUNTIME_FT_DYNEXT ) + ? try_load_path(interp, full_name) + : try_bytecode_extensions(interp, full_name); + + if ( full_name ) + return full_name; + } + + full_name = ( type & PARROT_RUNTIME_FT_DYNEXT ) ? try_load_path(interp, file) : try_bytecode_extensions(interp, file); @@ -308,60 +321,76 @@ */ return string_to_cstring(interp, result); } -/* - -=item C<char* Parrot_get_runtime_prefix(Interp *, STRING **prefix_str)> -If C<prefix_str> is not NULL, set it to the prefix, else return a malloced -c-string for the runtime prefix. Remember to free the string with -C<string_cstring_free()>. - -=cut +static STRING* +query_runtime_prefix ( Interp* interp ) { -*/ + STRING* prefix; -char* -Parrot_get_runtime_prefix(Interp *interp, STRING **prefix_str) -{ - STRING *s, *key; - PMC *config_hash; int free_it; char *env; env = Parrot_getenv("PARROT_RUNTIME", &free_it); + if (env) { - if (prefix_str) { - *prefix_str = string_from_cstring(interp, env, 0); - if (free_it) - free(env); - return NULL; - } - if (!free_it) - env = strdup(env); - return env; + prefix = string_from_cstring(interp, env, 0); + if (free_it) + mem_sys_free(env); + + return prefix; } + return NULL; +} + +/* + +=item C<STRING* Parrot_get_runtime_prefix(Interp * )> + +return the runtime prefix in the PMC string C<prefix>. The +config hash is consulted first, then the environment variable +PARROT_RUNTIME. If neither are found NULL is returned. +=cut + +*/ + +STRING* +Parrot_get_runtime_prefix (Interp *interp ) { + + PMC *config_hash; + + STRING *key, *can_fail; /* can_fail , for storing string pointers from + functions that may fail to return a prefix value + */ + + /* first look in the config hash for a user specified path */ + config_hash = VTABLE_get_pmc_keyed_int(interp, interp->iglobals, (INTVAL) IGLOBALS_CONFIG_HASH); - key = CONST_STRING(interp, "prefix"); - if (!VTABLE_elements(interp, config_hash)) { - const char *pwd = "."; - char *ret; - - if (prefix_str) { - *prefix_str = const_string(interp, pwd); - return NULL; + + if (VTABLE_elements(interp, config_hash)) { + key = CONST_STRING(interp, "prefix"); + can_fail = VTABLE_get_string_keyed_str(interp, config_hash, key); + + if ( can_fail ) { + /* + TODO: + shouldn't we do some sanity here ? , assuming this can be + set by random code/input we should see if it even exists. + */ + + return can_fail; } - ret = (char *)mem_sys_allocate(3); - strcpy(ret, pwd); - return ret; - } - s = VTABLE_get_string_keyed_str(interp, config_hash, key); - if (prefix_str) { - *prefix_str = s; - return NULL; } - return string_to_cstring(interp, s); + + /* + fallback: + + no value was found in the config hash so try a system query, if + that fails as well return the default. + */ + + return query_runtime_prefix(interp); } /* --- HEAD/include/parrot/library.h 2007-05-14 07:00:17.000000000 -0700 +++ path-api/include/parrot/library.h 2007-05-14 05:10:12.000000000 -0700 @@ -38,7 +38,7 @@ PARROT_API STRING* Parrot_locate_runtime_file_str(Interp *, STRING *file_name, enum_runtime_ft); -PARROT_API char* Parrot_get_runtime_prefix(Interp *, STRING **prefix); +PARROT_API STRING* Parrot_get_runtime_prefix(Interp *); void parrot_init_library_paths(Interp *); #endif /* PARROT_LIBRARY_H_GUARD */ --- HEAD/src/inter_misc.c 2007-05-12 04:26:05.000000000 -0700 +++ path-api/src/inter_misc.c 2007-05-14 05:10:12.000000000 -0700 @@ -341,10 +341,7 @@ return basename; case RUNTIME_PREFIX: - fullname_c = Parrot_get_runtime_prefix(interp, NULL); - fullname = string_from_cstring(interp, fullname_c, 0); - mem_sys_free(fullname_c); - return fullname; + return Parrot_get_runtime_prefix( interp ); default: /* or a warning only? */ internal_exception(UNIMPLEMENTED, --- HEAD/compilers/imcc/main.c 2007-05-12 04:26:22.000000000 -0700 +++ path-api/compilers/imcc/main.c 2007-05-14 06:20:01.000000000 -0700 @@ -196,6 +196,8 @@ char * parseflags(Parrot_Interp interp, int *argc, char **argv[]) { + STRING* prefix; + struct longopt_opt_info opt = LONGOPT_OPT_INFO_INIT; int status; if (*argc == 1) { @@ -272,7 +274,11 @@ exit(EX_USAGE); break; case OPT_RUNTIME_PREFIX: - printf("%s\n", Parrot_get_runtime_prefix(interp, NULL)); + prefix = Parrot_get_runtime_prefix(interp); + + printf("%s\n", (prefix) + ? string_to_cstring(interp,prefix) + : "no value for global config \"prefix\" or PARROT_RUNTIME"); exit(0); break; case 'V':
signature.asc
Description: PGP signature