Mercurial > emacs
changeset 94143:b9c54321b685
(Fexpand_file_name): Refine last fix so `nm' is only
relocated if it points to `name'.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Fri, 18 Apr 2008 02:26:05 +0000 |
parents | 14cbf4c7b904 |
children | 40901fec25aa |
files | src/ChangeLog src/fileio.c |
diffstat | 2 files changed, 10 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Fri Apr 18 02:01:46 2008 +0000 +++ b/src/ChangeLog Fri Apr 18 02:26:05 2008 +0000 @@ -1,3 +1,8 @@ +2008-04-18 Stefan Monnier <monnier@iro.umontreal.ca> + + * fileio.c (Fexpand_file_name): Refine last fix so `nm' is only + relocated if it points to `name'. + 2008-04-17 Kenichi Handa <handa@m17n.org> * data.c (Faset): Allow setting a multibyte character in an
--- a/src/fileio.c Fri Apr 18 02:01:46 2008 +0000 +++ b/src/fileio.c Fri Apr 18 02:26:05 2008 +0000 @@ -1045,6 +1045,7 @@ /* These point to SDATA and need to be careful with string-relocation during GC (via DECODE_FILE). */ unsigned char *nm, *newdir; + int nm_in_name; /* This should only point to alloca'd data. */ unsigned char *target; @@ -1158,11 +1159,13 @@ } nm = SDATA (name); + nm_in_name = 1; #ifdef DOS_NT /* We will force directory separators to be either all \ or /, so make a local copy to modify, even if there ends up being no change. */ nm = strcpy (alloca (strlen (nm) + 1), nm); + nm_in_name = 0; /* Note if special escape prefix is present, but remove for now. */ if (nm[0] == '/' && nm[1] == ':') @@ -1321,6 +1324,7 @@ if (index (nm, '/')) { nm = sys_translate_unix (nm); + nm_in_name = 0; return make_specified_string (nm, -1, strlen (nm), multibyte); } #endif /* VMS */ @@ -1396,6 +1400,7 @@ int offset = nm - SDATA (name); hdir = DECODE_FILE (tem); newdir = SDATA (hdir); + if (nm_in_name) nm = SDATA (name) + offset; } #ifdef DOS_NT