diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2012-11-18 00:45:18 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2012-11-18 00:45:18 +0000 |
commit | d918bddfc09c8f59fa45b1772cba106b663003b3 (patch) | |
tree | f4449d2327906c50553be8bb9719c1514adb947a /Source/Swig | |
parent | e450d4ebaca658c752dc8e5c9dd02e726cd064c5 (diff) | |
download | swig-d918bddfc09c8f59fa45b1772cba106b663003b3.tar.gz |
Fix segfaults when using filename paths greater than 1024 characters in length - use String * and heap instead of fixed size static char array buffers.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@13904 626c5289-ae23-0410-ae9c-e8d60b6d4f22
Diffstat (limited to 'Source/Swig')
-rw-r--r-- | Source/Swig/include.c | 60 | ||||
-rw-r--r-- | Source/Swig/swigfile.h | 8 |
2 files changed, 25 insertions, 43 deletions
diff --git a/Source/Swig/include.c b/Source/Swig/include.c index 3766894ae..6e76f86ba 100644 --- a/Source/Swig/include.c +++ b/Source/Swig/include.c @@ -317,58 +317,49 @@ File *Swig_filebyname(const_String_or_char_ptr filename) { } /* ----------------------------------------------------------------------------- - * Swig_file_suffix() + * Swig_file_extension() * - * Returns the suffix of a file + * Returns the extension of a file * ----------------------------------------------------------------------------- */ -char *Swig_file_suffix(const_String_or_char_ptr filename) { - char *d; - char *c = Char(filename); +String *Swig_file_extension(const_String_or_char_ptr filename) { + const char *d; + const char *c = Char(filename); int len = Len(filename); if (strlen(c)) { d = c + len - 1; while (d != c) { if (*d == '.') - return d; + return NewString(d); d--; } - return c + len; + return NewString(c + len); } - return c; + return NewString(c); } /* ----------------------------------------------------------------------------- * Swig_file_basename() * - * Returns the filename with no suffix attached. + * Returns the filename with the extension removed. * ----------------------------------------------------------------------------- */ -char *Swig_file_basename(const_String_or_char_ptr filename) { - static char tmp[1024]; - char *c; - strcpy(tmp, Char(filename)); - c = Swig_file_suffix(tmp); - *c = 0; - return tmp; +String *Swig_file_basename(const_String_or_char_ptr filename) { + String *extension = Swig_file_extension(filename); + String *basename = DohNewStringWithSize(filename, Len(filename) - Len(extension)); + Delete(extension); + return basename; } /* ----------------------------------------------------------------------------- * Swig_file_filename() * - * Return the file with any leading path stripped off + * Return the file name with any leading path stripped off * ----------------------------------------------------------------------------- */ -char *Swig_file_filename(const_String_or_char_ptr filename) { - static char tmp[1024]; +String *Swig_file_filename(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; - char *c; - - strcpy(tmp, Char(filename)); - c = strrchr(tmp, *delim); - if (c) - return c + 1; - else - return tmp; + const char *c = strrchr(Char(filename), *delim); + return c ? NewString(c + 1) : NewString(filename); } /* ----------------------------------------------------------------------------- @@ -376,19 +367,10 @@ char *Swig_file_filename(const_String_or_char_ptr filename) { * * Return the name of the directory associated with a file * ----------------------------------------------------------------------------- */ -char *Swig_file_dirname(const_String_or_char_ptr filename) { - static char tmp[1024]; +String *Swig_file_dirname(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; - char *c; - strcpy(tmp, Char(filename)); - if (!strstr(tmp, delim)) { - return ""; - } - c = tmp + strlen(tmp) - 1; - while (*c != *delim) - c--; - *(++c) = 0; - return tmp; + const char *c = strrchr(Char(filename), *delim); + return c ? NewStringWithSize(filename, c - Char(filename) + 1) : NewString(""); } /* diff --git a/Source/Swig/swigfile.h b/Source/Swig/swigfile.h index 158243c04..f12b33081 100644 --- a/Source/Swig/swigfile.h +++ b/Source/Swig/swigfile.h @@ -26,10 +26,10 @@ extern void Swig_set_push_dir(int dopush); extern int Swig_get_push_dir(void); extern void Swig_register_filebyname(const_String_or_char_ptr filename, File *outfile); extern File *Swig_filebyname(const_String_or_char_ptr filename); -extern char *Swig_file_suffix(const_String_or_char_ptr filename); -extern char *Swig_file_basename(const_String_or_char_ptr filename); -extern char *Swig_file_filename(const_String_or_char_ptr filename); -extern char *Swig_file_dirname(const_String_or_char_ptr filename); +extern String *Swig_file_extension(const_String_or_char_ptr filename); +extern String *Swig_file_basename(const_String_or_char_ptr filename); +extern String *Swig_file_filename(const_String_or_char_ptr filename); +extern String *Swig_file_dirname(const_String_or_char_ptr filename); extern void Swig_file_debug_set(); /* Delimiter used in accessing files and directories */ |