]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tftp: check for trailing ";mode=" in URL without strstr
authorDaniel Stenberg <daniel@haxx.se>
Wed, 15 Oct 2025 06:42:20 +0000 (08:42 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 15 Oct 2025 07:59:57 +0000 (09:59 +0200)
RFC 3617 defines two specific modes, "netascii" and "octet". This code
now checks only for those trailing ones - and not in the hostname since
they can't be there anymore.

Assisted-by: Jay Satiro
Closes #19070

docs/cmdline-opts/use-ascii.md
lib/tftp.c
src/tool_listhelp.c
tests/data/test1093

index 30cc860b0a21abcea427607ad7beeccdeed32e11..4dba446ffebfe1a94bd7a33bc9aa93f07acefb54 100644 (file)
@@ -4,8 +4,8 @@ SPDX-License-Identifier: curl
 Short: B
 Long: use-ascii
 Help: Use ASCII/text transfer
-Protocols: FTP LDAP
-Category: ftp output ldap
+Protocols: FTP LDAP TFTP
+Category: ftp output ldap tftp
 Added: 5.0
 Multi: boolean
 See-also:
@@ -18,5 +18,6 @@ Example:
 # `--use-ascii`
 
 Enable ASCII transfer mode. For FTP, this can also be enforced by using a URL
-that ends with `;type=A`. This option causes data sent to stdout to be in text
-mode for Win32 systems.
+that ends with `;type=A`. For TFTP, this can also be enforced by using a URL
+that ends with `;mode=netascii`. This option causes data sent to stdout to be
+in text mode for Win32 systems.
index 0a9b8a8e870b61f0d981c3224921f64ee862365c..d9d978c24e906e4edd0ba7351f84bea642c971f4 100644 (file)
@@ -1379,35 +1379,19 @@ static CURLcode tftp_do(struct Curl_easy *data, bool *done)
 static CURLcode tftp_setup_connection(struct Curl_easy *data,
                                       struct connectdata *conn)
 {
-  char *type;
+  char *path = data->state.up.path;
+  size_t len = strlen(path);
 
   conn->transport_wanted = TRNSPRT_UDP;
 
-  /* TFTP URLs support an extension like ";mode=<typecode>" that
-   * we will try to get now! */
-  type = strstr(data->state.up.path, ";mode=");
-
-  if(!type)
-    type = strstr(conn->host.rawalloc, ";mode=");
-
-  if(type) {
-    char command;
-    *type = 0;                   /* it was in the middle of the hostname */
-    command = Curl_raw_toupper(type[6]);
-
-    switch(command) {
-    case 'A': /* ASCII mode */
-    case 'N': /* NETASCII mode */
-      data->state.prefer_ascii = TRUE;
-      break;
-
-    case 'O': /* octet mode */
-    case 'I': /* binary mode */
-    default:
-      /* switch off ASCII */
-      data->state.prefer_ascii = FALSE;
-      break;
-    }
+  /* TFTP URLs support a trailing ";mode=netascii" or ";mode=octet" */
+  if((len >= 14) && !memcmp(&path[len - 14], ";mode=netascii", 14)) {
+    data->state.prefer_ascii = TRUE;
+    path[len - 14] = 0; /* cut it there */
+  }
+  else if((len >= 11) && !memcmp(&path[len - 11], ";mode=octet", 11)) {
+    data->state.prefer_ascii = FALSE;
+    path[len - 11] = 0; /* cut it there */
   }
 
   return CURLE_OK;
index c8e31e77a6aed1f6512251b61b89ba67e68b31fc..21019c7de1617b98be9b864418a2204cc91f43cf 100644 (file)
@@ -834,7 +834,7 @@ const struct helptxt helptext[] = {
    CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
   {"-B, --use-ascii",
    "Use ASCII/text transfer",
-   CURLHELP_FTP | CURLHELP_OUTPUT | CURLHELP_LDAP},
+   CURLHELP_FTP | CURLHELP_OUTPUT | CURLHELP_LDAP | CURLHELP_TFTP},
   {"-u, --user <user:password>",
    "Server user and password",
    CURLHELP_IMPORTANT | CURLHELP_AUTH},
index 1bed99bec18f44973d6758897668805eb4f9b515..a135876ae0c82cbbbcb0e363ebda18331515c158 100644 (file)
@@ -25,10 +25,10 @@ returned
 tftp
 </server>
 <name>
-TFTP retrieve with mode=i
+TFTP retrieve with mode=octet
 </name>
 <command>
-"tftp://%HOSTIP:%TFTPPORT//%TESTNUMBER;mode=i" --use-ascii
+"tftp://%HOSTIP:%TFTPPORT//%TESTNUMBER;mode=octet" --use-ascii
 </command>
 </client>