...
|
...
|
@@ -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;
|