[sftp-server.c]
     fix races in rename/symlink; from Tony Finch; ok djm@
This commit is contained in:
Damien Miller 2003-02-24 11:58:44 +11:00
parent 9f1e33a6b2
commit 9e51a73122
2 changed files with 18 additions and 15 deletions

View File

@ -48,6 +48,9 @@
- markus@cvs.openbsd.org 2003/02/06 09:27:29
[ssh.c ssh_config.5]
support 'ProxyCommand none'; bugzilla #433; binder@arago.de; ok djm@
- markus@cvs.openbsd.org 2003/02/06 09:29:18
[sftp-server.c]
fix races in rename/symlink; from Tony Finch; ok djm@
20030211
- (djm) Cygwin needs libcrypt too. Patch from vinschen@redhat.com
@ -1148,4 +1151,4 @@
save auth method before monitor_reset_key_state(); bugzilla bug #284;
ok provos@
$Id: ChangeLog,v 1.2606 2003/02/24 00:57:32 djm Exp $
$Id: ChangeLog,v 1.2607 2003/02/24 00:58:44 djm Exp $

View File

@ -22,7 +22,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "includes.h"
RCSID("$OpenBSD: sftp-server.c,v 1.38 2002/09/11 22:41:50 djm Exp $");
RCSID("$OpenBSD: sftp-server.c,v 1.39 2003/02/06 09:29:18 markus Exp $");
#include "buffer.h"
#include "bufaux.h"
@ -832,19 +832,22 @@ static void
process_rename(void)
{
u_int32_t id;
struct stat st;
char *oldpath, *newpath;
int ret, status = SSH2_FX_FAILURE;
int status;
id = get_int();
oldpath = get_string(NULL);
newpath = get_string(NULL);
TRACE("rename id %u old %s new %s", id, oldpath, newpath);
/* fail if 'newpath' exists */
if (stat(newpath, &st) == -1) {
ret = rename(oldpath, newpath);
status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
}
if (link(oldpath, newpath) == -1)
status = errno_to_portable(errno);
else if (unlink(oldpath) == -1) {
status = errno_to_portable(errno);
/* clean spare link */
unlink(newpath);
} else
status = SSH2_FX_OK;
send_status(id, status);
xfree(oldpath);
xfree(newpath);
@ -878,19 +881,16 @@ static void
process_symlink(void)
{
u_int32_t id;
struct stat st;
char *oldpath, *newpath;
int ret, status = SSH2_FX_FAILURE;
int ret, status;
id = get_int();
oldpath = get_string(NULL);
newpath = get_string(NULL);
TRACE("symlink id %u old %s new %s", id, oldpath, newpath);
/* fail if 'newpath' exists */
if (stat(newpath, &st) == -1) {
ret = symlink(oldpath, newpath);
status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
}
/* this will fail if 'newpath' exists */
ret = symlink(oldpath, newpath);
status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
send_status(id, status);
xfree(oldpath);
xfree(newpath);