X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/9486289ce452ab82ca8b3f16fae8c2ef5247a923..5a96ee059968da5fd2ba4fbd6321bb3ee76b3c9d:/rsync.c diff --git a/rsync.c b/rsync.c index 9d3b1c56..98af1cda 100644 --- a/rsync.c +++ b/rsync.c @@ -111,7 +111,7 @@ static int delete_file(char *fname) if (strcmp(dname,".")==0 || strcmp(dname,"..")==0) continue; - strncpy(buf, fname, (MAXPATHLEN-strlen(dname))-2); + strlcpy(buf, fname, (MAXPATHLEN-strlen(dname))-2); strcat(buf, "/"); strcat(buf, dname); buf[MAXPATHLEN-1] = 0; @@ -818,12 +818,6 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) } /* open tmp file */ - if (strlen(fname) > (MAXPATHLEN-8)) { - rprintf(FERROR,"filename too long\n"); - if (buf) unmap_file(buf); - close(fd1); - continue; - } if (tmpdir) { char *f; f = strrchr(fname,'/'); @@ -831,9 +825,30 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) f = fname; else f++; - sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f); + if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) { + rprintf(FERROR,"filename too long\n"); + if (buf) unmap_file(buf); + close(fd1); + continue; + } + sprintf(fnametmp,"%s/.%s.XXXXXX",tmpdir,f); } else { - sprintf(fnametmp,"%s.XXXXXX",fname); + char *f = strrchr(fname,'/'); + + if (strlen(fname)+9 > MAXPATHLEN) { + rprintf(FERROR,"filename too long\n"); + if (buf) unmap_file(buf); + close(fd1); + continue; + } + + if (f) { + *f = 0; + sprintf(fnametmp,"%s/.%s.XXXXXX",fname,f+1); + *f = '/'; + } else { + sprintf(fnametmp,".%s.XXXXXX",fname); + } } if (NULL == do_mktemp(fnametmp)) { rprintf(FERROR,"mktemp %s failed\n",fnametmp); @@ -976,8 +991,7 @@ void send_files(struct file_list *flist,int f_out,int f_in) fname[0] = 0; if (file->basedir) { - strncpy(fname,file->basedir,MAXPATHLEN-1); - fname[MAXPATHLEN-1] = 0; + strlcpy(fname,file->basedir,MAXPATHLEN-1); if (strlen(fname) == MAXPATHLEN-1) { io_error = 1; rprintf(FERROR, "send_files failed on long-named directory %s\n",