summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorgeorg@lmy002.wdf.sap.corp <>2005-07-26 07:41:32 +0200
committergeorg@lmy002.wdf.sap.corp <>2005-07-26 07:41:32 +0200
commitf09d06102ae16fc306a7c6bcdce87bf070677b50 (patch)
tree0b45d22139b90b40f9c5ec55f456bc4649c46c73 /extra
parent35b66a40c2054a223ce83fa506264bf222d61978 (diff)
downloadmariadb-git-f09d06102ae16fc306a7c6bcdce87bf070677b50.tar.gz
fix for bug#5650 ('replace' does not follow symlinks)
fix now checks if the original (from) file is a symlink and uses the link name. This prevents creation of a new file (and loss of symlink) when renaming the tempfile.
Diffstat (limited to 'extra')
-rw-r--r--extra/replace.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/extra/replace.c b/extra/replace.c
index 0b7d9600232..9acf1620d49 100644
--- a/extra/replace.c
+++ b/extra/replace.c
@@ -1053,12 +1053,18 @@ static int convert_file(REPLACE *rep, my_string name)
int error;
FILE *in,*out;
char dir_buff[FN_REFLEN], tempname[FN_REFLEN];
+ char link_name[FN_REFLEN], *org_name = name;
File temp_file;
DBUG_ENTER("convert_file");
- if (!(in=my_fopen(name,O_RDONLY,MYF(MY_WME))))
+ /* check if name is a symlink */
+#ifdef HAVE_READLINK
+ org_name= (!my_disable_symlinks &&
+ !my_readlink(link_name, name, MYF(0))) ? link_name : name;
+#endif
+ if (!(in= my_fopen(org_name,O_RDONLY,MYF(MY_WME))))
DBUG_RETURN(1);
- dirname_part(dir_buff,name);
+ dirname_part(dir_buff,org_name);
if ((temp_file= create_temp_file(tempname, dir_buff, "PR", O_WRONLY,
MYF(MY_WME))) < 0)
{
@@ -1075,7 +1081,7 @@ static int convert_file(REPLACE *rep, my_string name)
my_fclose(in,MYF(0)); my_fclose(out,MYF(0));
if (updated && ! error)
- my_redel(name,tempname,MYF(MY_WME | MY_LINK_WARNING));
+ my_redel(org_name,tempname,MYF(MY_WME | MY_LINK_WARNING));
else
my_delete(tempname,MYF(MY_WME));
if (!silent && ! error)