add various portability and potential segfault fixes involving getcwd()

calls


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2428 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
master
David Lawrence Ramsey 2005-03-26 04:42:28 +00:00
parent c15583da31
commit 6e0ed3c1c6
4 changed files with 41 additions and 33 deletions

View File

@ -12,8 +12,18 @@ CVS code -
cut_to_eol()
- Fix inaccurate comment. (DLR)
- files.c:
get_full_path()
- Rework handling of the results of getcwd() in order to avoid
segfaults if they fail, and to remove uses of the nonportable
GNU extension where passing a size of 0 will get a string as
long as we need. (DLR)
do_browser()
- Rename variable lineno to fileline to avoid confusion. (DLR)
do_browse_from()
- Rework handling of the results of getcwd() in order to avoid
segfaults if they fail, and to remove uses of the nonportable
GNU extension where passing a size of 0 will get a string as
long as we need. (DLR)
- nano.c:
help_init()
- When calculating allocsize, take multibyte characters into
@ -39,6 +49,11 @@ CVS code -
- Instead of breaking a line at a space and readding the space
afterwards, just break the line after the space, as it's more
efficient. (DLR)
- nano.h:
- Define PATH_MAX as 4096 if it isn't defined, as passing a size
of 0 to get a string as long as we need is a nonportable GNU
extension, and hence it won't work on non-GNU systems that
don't define PATH_MAX. (DLR)
- utils.c:
regexec_safe()
- Rename to safe_regexec() for consistency. (DLR)

View File

@ -983,15 +983,8 @@ char *get_full_path(const char *origpath)
return NULL;
/* Get the current directory. */
#if PATH_MAX != -1
d_here = charalloc(PATH_MAX + 1);
#else
d_here = NULL;
#endif
d_here = getcwd(d_here, PATH_MAX + 1);
#if PATH_MAX != -1
align(&d_here);
#endif
if (d_here != NULL) {
const char *last_slash;
@ -999,6 +992,8 @@ char *get_full_path(const char *origpath)
bool path_only;
struct stat fileinfo;
align(&d_here);
/* If the current directory isn't "/", tack a slash onto the end
* of it. */
if (strcmp(d_here, "/") != 0) {
@ -1055,26 +1050,24 @@ char *get_full_path(const char *origpath)
} else {
/* Get the full path and save it in d_there. */
free(d_there);
#if PATH_MAX != -1
d_there = charalloc(PATH_MAX + 1);
#else
d_there = NULL;
#endif
d_there = getcwd(d_there, PATH_MAX + 1);
#if PATH_MAX != -1
align(&d_there);
#endif
if (d_there == NULL)
d_there = charalloc(PATH_MAX + 1);
d_there = getcwd(d_there, PATH_MAX + 1);
if (d_there != NULL) {
align(&d_there);
if (strcmp(d_there, "/") != 0) {
/* Make sure d_there ends in a slash. */
d_there = charealloc(d_there,
strlen(d_there) + 2);
strcat(d_there, "/");
}
} else
/* If we couldn't get the full path, set path_only
* to TRUE so that we clean up correctly, free all
* allocated memory, and return NULL. */
path_only = TRUE;
else if (strcmp(d_there, "/") != 0) {
/* Make sure d_there ends in a slash. */
d_there = charealloc(d_there, strlen(d_there) + 2);
strcat(d_there, "/");
}
/* Finally, go back to the path specified in d_here,
* where we were before. */
@ -1090,7 +1083,7 @@ char *get_full_path(const char *origpath)
* d_there_file contains the filename portion of the answer. If
* this is the case, tack d_there_file onto the end of
* d_there, so that d_there contains the complete answer. */
if (!path_only && d_there) {
if (!path_only && d_there != NULL) {
d_there = charealloc(d_there, strlen(d_there) +
strlen(d_there_file) + 1);
strcat(d_there, d_there_file);
@ -2764,7 +2757,7 @@ char *do_browse_from(const char *inpath)
struct stat st;
char *path;
/* This holds the tilde-expanded version of inpath. */
DIR *dir;
DIR *dir = NULL;
assert(inpath != NULL);
@ -2780,15 +2773,12 @@ char *do_browse_from(const char *inpath)
striponedir(path);
if (stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) {
free(path);
#if PATH_MAX != -1
path = charalloc(PATH_MAX + 1);
#else
path = NULL;
#endif
path = getcwd(path, PATH_MAX + 1);
#if PATH_MAX != -1
if (path != NULL)
align(&path);
#endif
}
}
@ -2802,7 +2792,9 @@ char *do_browse_from(const char *inpath)
}
#endif
if (path != NULL)
dir = opendir(path);
if (dir == NULL) {
beep();
free(path);

View File

@ -55,7 +55,7 @@
/* Set a default value for PATH_MAX, so we can use it in lines like
* "path = getcwd(NULL, PATH_MAX + 1);". */
#ifndef PATH_MAX
#define PATH_MAX -1
#define PATH_MAX 4096
#endif
#ifdef USE_SLANG

View File

@ -110,6 +110,7 @@ bool parse_num(const char *str, ssize_t *val)
void align(char **strp)
{
assert(strp != NULL);
if (*strp != NULL)
*strp = charealloc(*strp, strlen(*strp) + 1);
}