From 712d79c7bb68768e909b9c533449247fd29498cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Mon, 22 Feb 2016 12:59:49 +0000 Subject: [PATCH] keep on fixing absolute_name --- C/c_interface.c | 5 +-- os/sysbits.c | 85 ++++++++++++++++--------------------------------- 2 files changed, 30 insertions(+), 60 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index 68ac337a9..ab03a88d2 100755 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -1,3 +1,4 @@ + /************************************************************************* * * YAP Prolog * * Yap Prolog was developed at NCCUP - Universidade do Porto * @@ -2348,7 +2349,7 @@ X_API Int YAP_Init(YAP_init_args *yap_init) { int restore_result; int do_bootstrap = (yap_init->YapPrologBootFile != NULL); CELL Trail = 0, Stack = 0, Heap = 0, Atts = 0; - char boot_file[256]; + char boot_file[YAP_FILENAME_MAX+1]; static int initialized = FALSE; /* ignore repeated calls to YAP_Init */ @@ -2367,7 +2368,7 @@ X_API Int YAP_Init(YAP_init_args *yap_init) { GLOBAL_argc = yap_init->Argc; #if BOOT_FROM_SAVED_STATE if (!yap_init->SavedState) { - yap_init->SavedState = Yap_locateFile(YAP_STARTUP, LOCAL_FileNameBuf, sizeof(LOCAL_FileNameBuf)-1); + yap_init->SavedState = Yap_locateFile(YAP_STARTUP, boot_file, sizeof(boot_file)-1); } #else diff --git a/os/sysbits.c b/os/sysbits.c index b1020cb90..437ec3755 100644 --- a/os/sysbits.c +++ b/os/sysbits.c @@ -294,11 +294,12 @@ Yap_IsAbsolutePath(const char *p0) // this is necessary because // support for ~expansion at the beginning // systems like Android do not do this. -static char * -PlExpandVars (const char *source) +static const char * +PlExpandVars (const char *source, const char *root, char *result) { const char *src = source; - char *result = LOCAL_FileNameBuf; + if (!result) + result = malloc(YAP_FILENAME_MAX+1); if (strlen(source) >= YAP_FILENAME_MAX) { Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "%s in true_file-name is larger than the buffer size (%d bytes)", source, strlen(source)); @@ -376,7 +377,21 @@ PlExpandVars (const char *source) strcpy( result, src); } else { - strncpy (result, source, YAP_FILENAME_MAX); + size_t tocp = strlen(src); + if (root) { + tocp = strlen(root)+1; + } + if (tocp > YAP_FILENAME_MAX) { + Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, MkStringTerm(src), "path too long"); + return NULL; + } + if (root) { + strncpy (result, root, YAP_FILENAME_MAX ); + strncat ( result, "/", YAP_FILENAME_MAX); + strncat ( result, source, YAP_FILENAME_MAX); + } else { + strncpy (result, source, strlen(src)+1 ); + } } return result; } @@ -618,14 +633,15 @@ Yap_AbsoluteFile(const char *spec, bool ok) { const char*p; const char*rc; - rc = expandVars(spec); + rc = PlExpandVars(spec, NULL, NULL); if (!rc) - return spec; + rc = spec; if ((p = myrealpath(rc) ) ) { return p; } else { return NULL; } + freeBuffer( rc ); } /** @@ -676,11 +692,8 @@ do_glob(const char *spec, bool glob_vs_wordexp) if (spec == NULL) { return TermNil; } - const char *espec = PlExpandVars( spec ); - #if _WIN32 || defined(__MINGW32__) { - char u[YAP_FILENAME_MAX+1]; WIN32_FIND_DATA find; HANDLE hFind; CELL *dest; @@ -718,6 +731,8 @@ do_glob(const char *spec, bool glob_vs_wordexp) return tf; } #elif HAVE_WORDEXP || HAVE_GLOB + char * espec = u; + strncpy( espec, spec, sizeof(u)); /* Expand the string for the program to run. */ size_t pathcount; #if HAVE_GLOB @@ -881,7 +896,7 @@ static const param_t expand_filename_defs[] = {EXPAND_FILENAME_DEFS()}; static Term do_expand_file_name(Term t1, Term opts USES_REGS) -{ +{ xarg *args; expand_filename_enum_choices_t i; bool use_system_expansion = true; @@ -1349,50 +1364,6 @@ working_directory(USES_REGS1) return true; } -static const char * - expandWithPrefix(const char *source, const char *root, char *target, bool expand) -{ - char *work; - - if (expand) - work = (char *)expandVars( source ); - else { - if (!target) - target = malloc(YAP_FILENAME_MAX); - work = target; - if (root) { - strncpy( work, root , YAP_FILENAME_MAX-1 ); - strncat( work, "/" , YAP_FILENAME_MAX-1 ); - strncat( work, source , YAP_FILENAME_MAX-1 ); - } else { - strncpy( work, source , YAP_FILENAME_MAX-1 ); - } - return work; - } - // expand names first - if (root && !Yap_IsAbsolutePath( source ) ) { - const char *s = expandVars( source); - if (!s) - return source; - const char *r0 = expandVars( root); - size_t sl = strlen(s); - size_t rl = strlen(r0); - if (!target) - target = malloc(YAP_FILENAME_MAX); - char *r = target; - strncat( r, r0, sl+rl+2 ); - strncat( r, "/", sl+rl+2 ); - strncat( r, s , sl+rl+2); - return r; - } else { - if (target != work) { - strncpy( target, work, sizeof(LOCAL_FileNameBuf)-1); - freeBuffer( work ); - } - return target; - } -} - /** Yap_findFile(): tries to locate a file, no expansion should be performed/ * * @@ -1410,7 +1381,6 @@ static const char * const char* Yap_findFile (const char *isource, const char * idef, const char *iroot, char *result, bool access, file_type_t ftype, bool expand_root, bool in_lib) { - char save_buffer[YAP_FILENAME_MAX+1]; const char *root, *source = isource; int rc = FAIL_RESTORE; @@ -1506,8 +1476,7 @@ Yap_findFile (const char *isource, const char * idef, const char *iroot, char * if (done) continue; // { CACHE_REGS __android_log_print(ANDROID_LOG_ERROR, __FUNCTION__, "root= %s %s ", root, source) ; } - const char *work = expandWithPrefix( source, root, result, false ); - + const char *work = PlExpandVars( source, root, result); // expand names in case you have // to add a prefix @@ -1554,7 +1523,7 @@ p_expand_file_name ( USES_REGS1 ) text = Yap_TextTermToText( t, NULL, 0); if (!text) return false; - if (!(text2 = PlExpandVars (text))) + if (!(text2 = PlExpandVars (text, NULL, NULL))) return false; freeBuffer( text ); bool rc = Yap_unify(ARG2, Yap_MkTextTerm(text2, t));