]> granicus.if.org Git - curl/commitdiff
Added a run-time check to warn if TFTP is going to fail due to portability
authorDan Fandrich <dan@coneharvesters.com>
Mon, 5 Dec 2005 20:07:05 +0000 (20:07 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Mon, 5 Dec 2005 20:07:05 +0000 (20:07 +0000)
issues in the code.

docs/KNOWN_BUGS
lib/tftp.c

index 264cdd7881328f54754e481701e61d9f61100816..ae41f65bced2d9e70189a76f62ccc378d50925df 100644 (file)
@@ -3,6 +3,8 @@ join in and help us correct one or more of these! Also be sure to check the
 changelog of the current development status, as one or more of these problems
 may have been fixed since this was written!
 
+28. The TFTP code is not portable and will fail on some architectures.
+
 26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in
   "system context" will make it use wrong(?) user name - at least when compared
   to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867
index e9d17ee1d1c80426b6779a8cbf727c03af175712..f2cd3fb01202c3fcc2caf74855a60ea1d0064e58 100644 (file)
@@ -529,6 +529,25 @@ CURLcode Curl_tftp_connect(struct connectdata *conn, bool *done)
   tftp_state_data_t     *state;
   int rc;
 
+  /*
+   * The TFTP code is not portable because it sends C structs directly over
+   * the wire.  Since C gives compiler writers a wide latitude in padding and
+   * aligning structs, this fails on many architectures (e.g. ARM).
+   * 
+   * The only portable way to fix this is to copy each struct item into a
+   * flat buffer and send the flat buffer instead of the struct.  The
+   * alternative, trying to get the compiler to eliminate padding bytes
+   * within the struct, is a nightmare to maintain (each compiler does it
+   * differently), and is still not guaranteed to work because some
+   * architectures can't handle the resulting alignment.
+   *
+   * This check can be removed once the code has been fixed.
+   */
+  if(sizeof(struct tftp_packet) != 516) {
+    failf(conn->data, "tftp not supported on this architecture");
+    return CURLE_FAILED_INIT;
+  }
+
   if((state = conn->proto.tftp = calloc(sizeof(tftp_state_data_t), 1))==NULL) {
     return CURLE_OUT_OF_MEMORY;
   }