...
|
...
|
@@ -733,10 +733,26 @@ redata_save(redata_t *redata, char *paramfilename, char **errordesc)
|
733
|
733
|
return(-1); /* sanity check failed */
|
734
|
734
|
}
|
735
|
735
|
filename=paramfilename;
|
|
736
|
+ memset(tmpfile,0,sizeof(tmpfile));
|
736
|
737
|
if(stat(paramfilename,&statbuf)==0
|
737
|
738
|
&& (statbuf.st_mode & S_IFLNK)!=0
|
738
|
|
- && readlink(paramfilename,tmplinkfilename,sizeof(tmplinkfilename))>0) {
|
739
|
|
- tmplinkfilename[sizeof(tmplinkfilename)-1]='\0';
|
|
739
|
+ && readlink(paramfilename,tmpfile,sizeof(tmpfile))>0) {
|
|
740
|
+ tmpfile[sizeof(tmpfile)-1]='\0';
|
|
741
|
+ if(tmpfile[0]=='/') {
|
|
742
|
+ /* absolute symlink, just copy it */
|
|
743
|
+ strncpy(tmplinkfilename,tmpfile,sizeof(tmplinkfilename));
|
|
744
|
+ tmplinkfilename[sizeof(tmplinkfilename)-1]='\0';
|
|
745
|
+ } else {
|
|
746
|
+ char *aux;
|
|
747
|
+ int off;
|
|
748
|
+ /* relative symlink, put it after the path of paramfilename */
|
|
749
|
+ off=0;
|
|
750
|
+ if((aux=mymemrchr(paramfilename,'/',strlen(paramfilename)))!=NULL)
|
|
751
|
+ off=(aux-paramfilename+1);
|
|
752
|
+ memcpy(tmplinkfilename,paramfilename,off);
|
|
753
|
+ strncpy(tmplinkfilename+off,tmpfile,sizeof(tmplinkfilename)-off);
|
|
754
|
+ tmplinkfilename[sizeof(tmplinkfilename)-1]='\0';
|
|
755
|
+ }
|
740
|
756
|
filename=tmplinkfilename;
|
741
|
757
|
}
|
742
|
758
|
if((securesave_genname(filename,tmpfile,sizeof(tmpfile)))==NULL) {
|
...
|
...
|
@@ -772,7 +788,7 @@ redata_save(redata_t *redata, char *paramfilename, char **errordesc)
|
772
|
788
|
}
|
773
|
789
|
for(i=0;i<redata->sizeplugins;i++) {
|
774
|
790
|
if(redata->plugins[i].postsave!=NULL)
|
775
|
|
- redata->plugins[i].postsave(redata,redata->plugins+i,redata->filename,filename);
|
|
791
|
+ redata->plugins[i].postsave(redata,redata->plugins+i,redata->filename,paramfilename);
|
776
|
792
|
}
|
777
|
793
|
strncpy(redata->filename,paramfilename,sizeof(redata->filename));
|
778
|
794
|
redata->filename[sizeof(redata->filename)-1]='\0';
|
...
|
...
|
@@ -2157,7 +2173,8 @@ mymemrchr(const void *s, int c, size_t n)
|
2157
|
2173
|
b=(*((unsigned int *)(&c)))&0xff;
|
2158
|
2174
|
for(i=0;i<n;i++) {
|
2159
|
2175
|
if(((unsigned char *)s)[i]==b)
|
2160
|
|
- res=(((unsigned char *)s)+i); }
|
|
2176
|
+ res=(((unsigned char *)s)+i);
|
|
2177
|
+ }
|
2161
|
2178
|
return(res);
|
2162
|
2179
|
}
|
2163
|
2180
|
|