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
This commit is contained in:
parent
e450d4ebac
commit
d918bddfc0
12 changed files with 100 additions and 78 deletions
|
|
@ -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("");
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue