tftpd: show requested file name in open error message
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 13 Feb 2020 11:58:46 +0000 (12:58 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 13 Feb 2020 11:58:46 +0000 (12:58 +0100)
function                                             old     new   delta
tftp_protocol                                       1902    1949     +47

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/tftp.c

index 04bfe844f86add4492777b68533f0587eb44f113..e7418688486df627ab32884f13e9827ec113dd3c 100644 (file)
@@ -402,9 +402,17 @@ static int tftp_protocol(
                /* Open file (must be after changing user) */
                local_fd = open(local_file, open_mode, 0666);
                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;
                        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! */
 #if ENABLE_FEATURE_TFTP_BLOCKSIZE
@@ -721,7 +729,7 @@ static int tftp_protocol(
                 *  must never resend the current DATA packet on receipt
                 *  of a duplicate ACK".
                 * 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:
                 * http://en.wikipedia.org/wiki/Sorcerer's_Apprentice_Syndrome
                 */
@@ -740,6 +748,7 @@ static int tftp_protocol(
  send_err_pkt:
        if (G_error_pkt_str[0])
                bb_simple_error_msg(G_error_pkt_str);
+ send_err_pkt_nomsg:
        G.error_pkt[1] = TFTP_ERROR;
        xsendto(socket_fd, G.error_pkt, 4 + 1 + strlen(G_error_pkt_str),
                        &peer_lsa->u.sa, peer_lsa->len);