--- vsftpd-2.0.3/postlogin.c.uniq_rename 2005-03-19 12:15:59.000000000 +0100 +++ vsftpd-2.0.3/postlogin.c 2005-07-18 15:52:20.000000000 +0200 @@ -70,7 +70,7 @@ static void check_abor(struct vsf_session* p_sess); static void handle_sigurg(void* p_private); static void handle_upload_common(struct vsf_session* p_sess, int is_append, - int is_unique); + int is_unique, int uniq_rename); static void get_unique_filename(struct mystr* p_outstr, const struct mystr* p_base); static int data_transfer_checks_ok(struct vsf_session* p_sess); @@ -931,11 +931,11 @@ static void handle_stor(struct vsf_session* p_sess) { - handle_upload_common(p_sess, 0, 0); + handle_upload_common(p_sess, 0, 0, 1); } static void -handle_upload_common(struct vsf_session* p_sess, int is_append, int is_unique) +handle_upload_common(struct vsf_session* p_sess, int is_append, int is_unique, int uniq_rename) { static struct mystr s_filename; struct mystr* p_filename; @@ -952,6 +952,12 @@ p_filename = &p_sess->ftp_arg_str; if (is_unique) { + if (uniq_rename) + if (!vsf_access_check_file(p_filename)) + { + vsf_cmdio_write(p_sess, FTP_NOPERM, "Permission denied."); + return; + } get_unique_filename(&s_filename, p_filename); p_filename = &s_filename; } @@ -1057,6 +1063,14 @@ port_cleanup(p_sess); pasv_cleanup(p_sess); vsf_sysutil_close(new_file_fd); + if (is_unique && uniq_rename) + /* NOTE - might overwrite destination file. Not a concern because the same + * could be accomplished with DELE. + */ + { + printf("I'm here\n");//vsf_cmdio_write(p_sess, FTP_TRANSFEROK, "IM HERE."); + str_rename(p_filename, &p_sess->ftp_arg_str); + } } static void @@ -1477,7 +1491,7 @@ static void handle_appe(struct vsf_session* p_sess) { - handle_upload_common(p_sess, 1, 0); + handle_upload_common(p_sess, 1, 0, 0); } static void @@ -1655,7 +1669,7 @@ static void handle_stou(struct vsf_session* p_sess) { - handle_upload_common(p_sess, 0, 1); + handle_upload_common(p_sess, 0, 1, 0); } static void @@ -1804,4 +1818,3 @@ } } } -