aboutsummaryrefslogtreecommitdiff
path: root/Source/Swig
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2012-11-18 00:45:18 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2012-11-18 00:45:18 +0000
commitd918bddfc09c8f59fa45b1772cba106b663003b3 (patch)
treef4449d2327906c50553be8bb9719c1514adb947a /Source/Swig
parente450d4ebaca658c752dc8e5c9dd02e726cd064c5 (diff)
downloadswig-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.c60
-rw-r--r--Source/Swig/swigfile.h8
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 */