diff options
author | georg@lmy002.wdf.sap.corp <> | 2005-07-26 07:41:32 +0200 |
---|---|---|
committer | georg@lmy002.wdf.sap.corp <> | 2005-07-26 07:41:32 +0200 |
commit | f09d06102ae16fc306a7c6bcdce87bf070677b50 (patch) | |
tree | 0b45d22139b90b40f9c5ec55f456bc4649c46c73 /extra | |
parent | 35b66a40c2054a223ce83fa506264bf222d61978 (diff) | |
download | mariadb-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.c | 12 |
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) |