tftpd: show requested file name in open error message

function                                             old     new   delta
tftp_protocol                                       1902    1949     +47

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2020-02-13 12:58:46 +01:00
parent bd8b05ba1b
commit 260bd21169

View File

@ -402,9 +402,17 @@ static int tftp_protocol(
/* Open file (must be after changing user) */ /* Open file (must be after changing user) */
local_fd = open(local_file, open_mode, 0666); local_fd = open(local_file, open_mode, 0666);
if (local_fd < 0) { if (local_fd < 0) {
/* sanitize name, it came from untrusted remote side */
unsigned char *p = (void *) local_file;
while (*p) {
if (*p < ' ')
*p = '?';
p++;
}
bb_perror_msg("can't open '%s'", local_file);
G_error_pkt_reason = ERR_NOFILE; G_error_pkt_reason = ERR_NOFILE;
strcpy(G_error_pkt_str, "can't open file"); strcpy(G_error_pkt_str, "can't open file");
goto send_err_pkt; goto send_err_pkt_nomsg;
} }
/* gcc 4.3.1 would NOT optimize it out as it should! */ /* gcc 4.3.1 would NOT optimize it out as it should! */
#if ENABLE_FEATURE_TFTP_BLOCKSIZE #if ENABLE_FEATURE_TFTP_BLOCKSIZE
@ -721,7 +729,7 @@ static int tftp_protocol(
* must never resend the current DATA packet on receipt * must never resend the current DATA packet on receipt
* of a duplicate ACK". * of a duplicate ACK".
* DATA pkts are resent ONLY on timeout. * DATA pkts are resent ONLY on timeout.
* Thus "goto send_again" will ba a bad mistake above. * Thus "goto send_again" will be a bad mistake above.
* See: * See:
* http://en.wikipedia.org/wiki/Sorcerer's_Apprentice_Syndrome * http://en.wikipedia.org/wiki/Sorcerer's_Apprentice_Syndrome
*/ */
@ -740,6 +748,7 @@ static int tftp_protocol(
send_err_pkt: send_err_pkt:
if (G_error_pkt_str[0]) if (G_error_pkt_str[0])
bb_simple_error_msg(G_error_pkt_str); bb_simple_error_msg(G_error_pkt_str);
send_err_pkt_nomsg:
G.error_pkt[1] = TFTP_ERROR; G.error_pkt[1] = TFTP_ERROR;
xsendto(socket_fd, G.error_pkt, 4 + 1 + strlen(G_error_pkt_str), xsendto(socket_fd, G.error_pkt, 4 + 1 + strlen(G_error_pkt_str),
&peer_lsa->u.sa, peer_lsa->len); &peer_lsa->u.sa, peer_lsa->len);