Browse code

bugfix: Saving a file now follows symlinks

Dario Rodriguez authored on 11/07/2021 09:29:02
Showing 1 changed files
... ...
@@ -719,18 +719,27 @@ redata_load(redata_t *redata, char *filename, char **errordesc)
719 719
 }
720 720
 
721 721
 int
722
-redata_save(redata_t *redata, char *filename, char **errordesc)
722
+redata_save(redata_t *redata, char *paramfilename, char **errordesc)
723 723
 {
724 724
         int fd;
725 725
         int i,n;
726
+        char tmplinkfilename[PATH_MAX+1];
726 727
         char tmpfile[PATH_MAX+1];
727 728
         struct stat statbuf;
728
-        if(redata==NULL || filename==NULL) {
729
+        char *filename;
730
+        if(redata==NULL || paramfilename==NULL) {
729 731
                 if(errordesc!=NULL)
730 732
                         *errordesc="Internal error";
731 733
                 return(-1); /* sanity check failed */
732 734
         }
733
-        if((securesave_genname(redata->filename,tmpfile,sizeof(tmpfile)))==NULL) {
735
+        filename=paramfilename;
736
+        if(stat(paramfilename,&statbuf)==0
737
+          && (statbuf.st_mode & S_IFLNK)!=0
738
+          && readlink(paramfilename,tmplinkfilename,sizeof(tmplinkfilename))>0) {
739
+                tmplinkfilename[sizeof(tmplinkfilename)-1]='\0';
740
+                filename=tmplinkfilename;
741
+        }
742
+        if((securesave_genname(filename,tmpfile,sizeof(tmpfile)))==NULL) {
734 743
                 if(errordesc!=NULL)
735 744
                         *errordesc="Malformed filename";
736 745
                 return(-1); /* malformed filename */
... ...
@@ -765,7 +774,7 @@ redata_save(redata_t *redata, char *filename, char **errordesc)
765 774
                 if(redata->plugins[i].postsave!=NULL)
766 775
                         redata->plugins[i].postsave(redata,redata->plugins+i,redata->filename,filename);
767 776
         }
768
-        strncpy(redata->filename,filename,sizeof(redata->filename));
777
+        strncpy(redata->filename,paramfilename,sizeof(redata->filename));
769 778
         redata->filename[sizeof(redata->filename)-1]='\0';
770 779
         /* mark as not modified */
771 780
         redata->needs_saving=0;