diff -Naur busybox.orig/networking/tftp.c busybox/networking/tftp.c
--- busybox.orig/networking/tftp.c	2008-03-17 18:23:14 +0000
+++ busybox/networking/tftp.c	2008-03-17 20:23:39 +0000
@@ -575,22 +575,26 @@
 		}
 	}
 #endif
-	xstat(filename, &statbuf);
 	/* if opcode == TFTP_WRQ: */
 	cmd = 1; /* CMD_GET: we will receive file's data */
 	req_modebits = 0222; /* writable by anyone */
-	open_mode = O_WRONLY | O_TRUNC;
+	open_mode = O_CREAT | O_WRONLY | O_TRUNC;
 	if (opcode == TFTP_RRQ) {
 		cmd = 2; /* CMD_PUT */
 		req_modebits = 0444; /* readable by anyone */
 		open_mode = O_RDONLY;
 	}
-	if (!S_ISREG(statbuf.st_mode)
-	 || (statbuf.st_mode & req_modebits) != req_modebits
+	result = stat(filename, &statbuf); // file exists?
+	// open/create new file
+	local_fd = xopen(filename, open_mode);
+	// check permissions, but only for existing files!
+	// or else we can not upload new files at all!
+	if (!result &&
+		(!S_ISREG(statbuf.st_mode) ||
+		(statbuf.st_mode & req_modebits) != req_modebits)
 	) {
 		bb_error_msg_and_die("access to '%s' is denied", filename);
 	}
-	local_fd = xopen(filename, open_mode);
 
 	close(STDIN_FILENO); /* close old, possibly wildcard socket */
 	/* tftp_protocol() will create new one, bound to particular local IP */
