strncmp(flist->files[j].name,last_name, strlen(last_name))==0)
continue;
last_name = flist->files[j].name;
+ if (!(local_file_list = send_file_list(-1,1,&last_name)))
+ continue;
if (verbose > 1)
fprintf(FINFO,"deleting in %s\n", last_name);
- if (!(local_file_list = send_file_list(-1,1,&last_name)))
- return;
for (i=local_file_list->count-1;i>=0;i--) {
if (!local_file_list->files[i].name) continue;
}
/* open tmp file */
+ if (strlen(fname) > (MAXPATHLEN-8)) {
+ fprintf(FERROR,"filename too long\n");
+ close(fd1);
+ continue;
+ }
sprintf(fnametmp,"%s.XXXXXX",fname);
if (NULL == mktemp(fnametmp)) {
fprintf(FERROR,"mktemp %s failed\n",fnametmp);
continue;
}
fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
- if (relative_paths && errno == ENOENT &&
+ if (fd2 == -1 && relative_paths && errno == ENOENT &&
create_directory_path(fnametmp) == 0) {
fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
}
if (make_backups) {
char fnamebak[MAXPATHLEN];
+ if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
+ fprintf(FERROR,"backup filename too long\n");
+ continue;
+ }
sprintf(fnamebak,"%s%s",fname,backup_suffix);
if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
}
}
+ if (preserve_hard_links)
+ do_hard_links(flist);
+
/* now we need to fix any directory permissions that were
modified during the transfer */
- if (!am_root) {
- for (i = 0; i < flist->count; i++) {
- struct file_struct *file = &flist->files[i];
- if (!file->name || !S_ISDIR(file->mode)) continue;
- recv_generator(file->name,flist,i,-1);
- }
+ for (i = 0; i < flist->count; i++) {
+ struct file_struct *file = &flist->files[i];
+ if (!file->name || !S_ISDIR(file->mode)) continue;
+ recv_generator(file->name,flist,i,-1);
}
-
if (verbose > 2)
fprintf(FERROR,"recv_files finished\n");
fname[0] = 0;
if (file->dir) {
- strcpy(fname,file->dir);
+ strncpy(fname,file->dir,MAXPATHLEN-1);
+ fname[MAXPATHLEN-1] = 0;
strcat(fname,"/");
}
- strcat(fname,file->name);
+ strncat(fname,file->name,MAXPATHLEN-strlen(fname));
if (verbose > 2)
fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
/* map the local file */
if (fstat(fd,&st) != 0) {
fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
+ close(fd);
return -1;
}