]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - net/tftp.c
Fix printf errors.
[people/ms/u-boot.git] / net / tftp.c
index 888ec987cfcb24edecfb3fea028802acceb557bc..84d83ca97b1e9f333efe1fa780c3803ce6cadca5 100644 (file)
@@ -15,7 +15,7 @@
 #if defined(CONFIG_CMD_NET)
 
 #define WELL_KNOWN_PORT        69              /* Well known TFTP port #               */
-#define TIMEOUT                5               /* Seconds to timeout for a lost pkt    */
+#define TIMEOUT                5UL             /* Seconds to timeout for a lost pkt    */
 #ifndef        CONFIG_NET_RETRY_COUNT
 # define TIMEOUT_COUNT 10              /* # of timeouts before giving up  */
 #else
@@ -34,7 +34,7 @@
 #define TFTP_ERROR     5
 #define TFTP_OACK      6
 
-
+static IPaddr_t TftpServerIP;
 static int     TftpServerPort;         /* The UDP port at their end            */
 static int     TftpOurPort;            /* The UDP port at our end              */
 static int     TftpTimeoutCount;
@@ -55,7 +55,14 @@ static int   TftpState;
 
 #define DEFAULT_NAME_LEN       (8 + 4 + 1)
 static char default_filename[DEFAULT_NAME_LEN];
-static char *tftp_filename;
+
+#ifndef CONFIG_TFTP_FILE_NAME_MAX_LEN
+#define MAX_LEN 128
+#else
+#define MAX_LEN CONFIG_TFTP_FILE_NAME_MAX_LEN
+#endif
+
+static char tftp_filename[MAX_LEN];
 
 #ifdef CFG_DIRECT_FLASH_TFTP
 extern flash_info_t flash_info[];
@@ -171,14 +178,14 @@ TftpSend (void)
                pkt += 5 /*strlen("octet")*/ + 1;
                strcpy ((char *)pkt, "timeout");
                pkt += 7 /*strlen("timeout")*/ + 1;
-               sprintf((char *)pkt, "%d", TIMEOUT);
+               sprintf((char *)pkt, "%lu", TIMEOUT);
 #ifdef ET_DEBUG
                printf("send option \"timeout %s\"\n", (char *)pkt);
 #endif
                pkt += strlen((char *)pkt) + 1;
                /* try for more effic. blk size */
                pkt += sprintf((char *)pkt,"blksize%c%d%c",
-                               0,htons(TftpBlkSizeOption),0);
+                               0,TftpBlkSizeOption,0);
 #ifdef CONFIG_MCAST_TFTP
                /* Check all preconditions before even trying the option */
                if (!ProhibitMcast
@@ -231,7 +238,7 @@ TftpSend (void)
                break;
        }
 
-       NetSendUDPPacket(NetServerEther, NetServerIP, TftpServerPort, TftpOurPort, len);
+       NetSendUDPPacket(NetServerEther, TftpServerIP, TftpServerPort, TftpOurPort, len);
 }
 
 
@@ -276,8 +283,12 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
 #endif
                TftpState = STATE_OACK;
                TftpServerPort = src;
-               /* Check for 'blksize' option */
-               for (i=0;i<len-8;i++) {
+               /*
+                * Check for 'blksize' option.
+                * Careful: "i" is signed, "len" is unsigned, thus
+                * something like "len-8" may give a *huge* number
+                */
+               for (i=0; i+8<len; i++) {
                        if (strcmp ((char*)pkt+i,"blksize") == 0) {
                                TftpBlkSize = (unsigned short)
                                        simple_strtoul((char*)pkt+i+8,NULL,10);
@@ -368,7 +379,7 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
 #ifdef CONFIG_MCAST_TFTP
                /* if I am the MasterClient, actively calculate what my next
                 * needed block is; else I'm passive; not ACKING
-                */
+                */
                if (Multicast) {
                        if (len < TftpBlkSize)  {
                                TftpEndingBlock = TftpBlock;
@@ -449,30 +460,43 @@ TftpStart (void)
        char *ep;             /* Environment pointer */
 #endif
 
+       TftpServerIP = NetServerIP;
        if (BootFile[0] == '\0') {
                sprintf(default_filename, "%02lX%02lX%02lX%02lX.img",
                        NetOurIP & 0xFF,
                        (NetOurIP >>  8) & 0xFF,
                        (NetOurIP >> 16) & 0xFF,
                        (NetOurIP >> 24) & 0xFF );
-               tftp_filename = default_filename;
+
+               strncpy(tftp_filename, default_filename, MAX_LEN);
+               tftp_filename[MAX_LEN-1] = 0;
 
                printf ("*** Warning: no boot file name; using '%s'\n",
                        tftp_filename);
        } else {
-               tftp_filename = BootFile;
+               char *p = strchr (BootFile, ':');
+
+               if (p == NULL) {
+                       strncpy(tftp_filename, BootFile, MAX_LEN);
+                       tftp_filename[MAX_LEN-1] = 0;
+               } else {
+                       *p++ = '\0';
+                       TftpServerIP = string_to_ip (BootFile);
+                       strncpy(tftp_filename, p, MAX_LEN);
+                       tftp_filename[MAX_LEN-1] = 0;
+               }
        }
 
 #if defined(CONFIG_NET_MULTI)
        printf ("Using %s device\n", eth_get_name());
 #endif
-       puts ("TFTP from server ");     print_IPaddr (NetServerIP);
+       puts ("TFTP from server ");     print_IPaddr (TftpServerIP);
        puts ("; our IP address is ");  print_IPaddr (NetOurIP);
 
        /* Check if we need to send across this subnet */
        if (NetOurGatewayIP && NetOurSubnetMask) {
-           IPaddr_t OurNet     = NetOurIP    & NetOurSubnetMask;
-           IPaddr_t ServerNet  = NetServerIP & NetOurSubnetMask;
+           IPaddr_t OurNet     = NetOurIP    & NetOurSubnetMask;
+           IPaddr_t ServerNet  = TftpServerIP & NetOurSubnetMask;
 
            if (OurNet != ServerNet) {
                puts ("; sending through gateway ");
@@ -518,7 +542,7 @@ TftpStart (void)
        /* Revert TftpBlkSize to dflt */
        TftpBlkSize = TFTP_BLOCK_SIZE;
 #ifdef CONFIG_MCAST_TFTP
-       mcast_cleanup();
+       mcast_cleanup();
 #endif
 
        TftpSend ();
@@ -614,4 +638,4 @@ static void parse_multicast_oack(char *pkt, int len)
 
 #endif /* Multicast TFTP */
 
-#endif /* CFG_CMD_NET */
+#endif