Browse code

bugfix: saving a file to a relative symlink now also works. This also fix the filename sent to plugins in files that are symlinks.

Dario Rodriguez authored on 11/07/2021 10:35:47
Showing 1 changed files
... ...
@@ -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