]> granicus.if.org Git - curl/commitdiff
Fix tftp return codes and tsize upload handling
authorBen Greear <greearb@candelatech.com>
Sun, 21 Mar 2010 22:24:36 +0000 (23:24 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 21 Mar 2010 22:24:36 +0000 (23:24 +0100)
Error codes were not properly returned to the main curl code (and on to apps
using libcurl).

tftp was crapping out when tsize == 0 on upload, but I see no reason to fail
to upload just because the remote file is zero-length.  Ignore tsize option on
upload.

lib/tftp.c

index cab6c09d458bf676adfa77132e17ae54a45e2978..dde17735adae808cf13a3f1da291c2d5234b89dd 100644 (file)
@@ -398,12 +398,17 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
       long tsize = 0;
 
       tsize = strtol( value, NULL, 10 );
-      if(!tsize) {
-        failf(data, "invalid tsize -:%s:- value in OACK packet", value);
-        return CURLE_TFTP_ILLEGAL;
-      }
-      Curl_pgrsSetDownloadSize(data, tsize);
       infof(data, "%s (%ld)\n", "tsize parsed from OACK", tsize);
+
+      /* tsize should be ignored on upload: Who cares about the size of the
+         remote file? */
+      if (!data->set.upload) {
+        if(!tsize) {
+          failf(data, "invalid tsize -:%s:- value in OACK packet", value);
+          return CURLE_TFTP_ILLEGAL;
+        }
+        Curl_pgrsSetDownloadSize(data, tsize);
+      }
     }
   }
 
@@ -1471,8 +1476,11 @@ static CURLcode tftp_do(struct connectdata *conn, bool *done)
 
   code = tftp_perform(conn, done);
 
-  /* If we have encountered an error */
-  code = tftp_translate_code(state->error);
+  /* If tftp_perform() returned an error, use that for return code. If it
+     was OK, see if tftp_translate_code() has an error. */
+  if (code == CURLE_OK) 
+    /* If we have encountered an internal tftp error, translate it. */
+    code = tftp_translate_code(state->error);
 
   return code;
 }