tftpd: fix download: we must change user AFTER bind
tftp_protocol 1466 1468 +2
This commit is contained in:
parent
403a5a298e
commit
7a60133c6c
@ -83,9 +83,7 @@ enum {
|
|||||||
struct globals {
|
struct globals {
|
||||||
/* u16 TFTP_ERROR; u16 reason; both network-endian, then error text: */
|
/* u16 TFTP_ERROR; u16 reason; both network-endian, then error text: */
|
||||||
uint8_t error_pkt[4 + 32];
|
uint8_t error_pkt[4 + 32];
|
||||||
#if ENABLE_TFTPD
|
|
||||||
char *user_opt;
|
char *user_opt;
|
||||||
#endif
|
|
||||||
/* used in tftpd_main(), a bit big for stack: */
|
/* used in tftpd_main(), a bit big for stack: */
|
||||||
char block_buf[TFTP_BLKSIZE_DEFAULT];
|
char block_buf[TFTP_BLKSIZE_DEFAULT];
|
||||||
};
|
};
|
||||||
@ -183,7 +181,7 @@ static int tftp_protocol(
|
|||||||
int open_mode, local_fd;
|
int open_mode, local_fd;
|
||||||
int retries, waittime_ms;
|
int retries, waittime_ms;
|
||||||
int io_bufsize = blksize + 4;
|
int io_bufsize = blksize + 4;
|
||||||
char *cp;
|
char *cp = cp; /* for compiler */
|
||||||
/* Can't use RESERVE_CONFIG_BUFFER here since the allocation
|
/* Can't use RESERVE_CONFIG_BUFFER here since the allocation
|
||||||
* size varies meaning BUFFERS_GO_ON_STACK would fail */
|
* size varies meaning BUFFERS_GO_ON_STACK would fail */
|
||||||
/* We must keep the transmit and receive buffers seperate */
|
/* We must keep the transmit and receive buffers seperate */
|
||||||
@ -194,40 +192,8 @@ static int tftp_protocol(
|
|||||||
socket_fd = xsocket(peer_lsa->u.sa.sa_family, SOCK_DGRAM, 0);
|
socket_fd = xsocket(peer_lsa->u.sa.sa_family, SOCK_DGRAM, 0);
|
||||||
setsockopt_reuseaddr(socket_fd);
|
setsockopt_reuseaddr(socket_fd);
|
||||||
|
|
||||||
#if ENABLE_TFTPD
|
|
||||||
if (user_opt) {
|
|
||||||
struct passwd *pw = getpwnam(user_opt); /* initgroups, setgid, setuid */
|
|
||||||
if (!pw)
|
|
||||||
bb_error_msg_and_die("unknown user '%s'", user_opt);
|
|
||||||
change_identity(pw);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (CMD_PUT(option_mask32)) {
|
|
||||||
open_mode = O_RDONLY;
|
|
||||||
} else {
|
|
||||||
open_mode = O_WRONLY | O_TRUNC | O_CREAT;
|
|
||||||
#if ENABLE_TFTPD
|
|
||||||
if ((option_mask32 & (TFTPD_OPT+TFTPD_OPT_c)) == TFTPD_OPT) {
|
|
||||||
/* tftpd without -c */
|
|
||||||
open_mode = O_WRONLY | O_TRUNC;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (!(option_mask32 & TFTPD_OPT)) {
|
|
||||||
local_fd = CMD_GET(option_mask32) ? STDOUT_FILENO : STDIN_FILENO;
|
|
||||||
if (NOT_LONE_DASH(local_file))
|
|
||||||
local_fd = xopen(local_file, open_mode);
|
|
||||||
} else {
|
|
||||||
local_fd = open_or_warn(local_file, open_mode);
|
|
||||||
if (local_fd < 0) {
|
|
||||||
/*error_pkt_reason = ERR_NOFILE/ERR_ACCESS?*/
|
|
||||||
strcpy(error_pkt_str, "can't open file");
|
|
||||||
goto send_err_pkt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
block_nr = 1;
|
block_nr = 1;
|
||||||
|
|
||||||
if (!ENABLE_TFTP || our_lsa) {
|
if (!ENABLE_TFTP || our_lsa) {
|
||||||
/* tftpd */
|
/* tftpd */
|
||||||
|
|
||||||
@ -258,9 +224,48 @@ static int tftp_protocol(
|
|||||||
* that is, for "block 0" which is our OACK pkt */
|
* that is, for "block 0" which is our OACK pkt */
|
||||||
opcode = TFTP_OACK;
|
opcode = TFTP_OACK;
|
||||||
cp = xbuf + 2;
|
cp = xbuf + 2;
|
||||||
|
/* to be continued, see below */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (user_opt) {
|
||||||
|
struct passwd *pw = getpwnam(user_opt);
|
||||||
|
if (!pw)
|
||||||
|
bb_error_msg_and_die("unknown user '%s'", user_opt);
|
||||||
|
change_identity(pw); /* initgroups, setgid, setuid */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open local file (must be after changing user) */
|
||||||
|
if (CMD_PUT(option_mask32)) {
|
||||||
|
open_mode = O_RDONLY;
|
||||||
|
} else {
|
||||||
|
open_mode = O_WRONLY | O_TRUNC | O_CREAT;
|
||||||
|
#if ENABLE_TFTPD
|
||||||
|
if ((option_mask32 & (TFTPD_OPT+TFTPD_OPT_c)) == TFTPD_OPT) {
|
||||||
|
/* tftpd without -c */
|
||||||
|
open_mode = O_WRONLY | O_TRUNC;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (!(option_mask32 & TFTPD_OPT)) {
|
||||||
|
local_fd = CMD_GET(option_mask32) ? STDOUT_FILENO : STDIN_FILENO;
|
||||||
|
if (NOT_LONE_DASH(local_file))
|
||||||
|
local_fd = xopen(local_file, open_mode);
|
||||||
|
} else {
|
||||||
|
local_fd = open_or_warn(local_file, open_mode);
|
||||||
|
if (local_fd < 0) {
|
||||||
|
/*error_pkt_reason = ERR_NOFILE/ERR_ACCESS?*/
|
||||||
|
strcpy(error_pkt_str, "can't open file");
|
||||||
|
goto send_err_pkt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ENABLE_TFTP || our_lsa) {
|
||||||
|
#if ENABLE_FEATURE_TFTP_BLOCKSIZE
|
||||||
|
if (blksize != TFTP_BLKSIZE_DEFAULT) {
|
||||||
|
/* Create and send OACK packet. continued */
|
||||||
goto add_blksize_opt;
|
goto add_blksize_opt;
|
||||||
}
|
}
|
||||||
/* else: just fall into while (1) loop below */
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* tftp */
|
/* tftp */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user