diff --git a/tests/data/test1007 b/tests/data/test1007
index 5966ab366..6baf221eb 100644
--- a/tests/data/test1007
+++ b/tests/data/test1007
@@ -32,8 +32,11 @@ This data will not be sent
opcode: 2
-filename: /invalid-file
mode: octet
+tsize: 27
+blksize: 512
+timeout: 6
+filename: /invalid-file
diff --git a/tests/data/test1009 b/tests/data/test1009
index b0a93e5e0..e1929beb2 100644
--- a/tests/data/test1009
+++ b/tests/data/test1009
@@ -37,8 +37,11 @@ tftp://%HOSTIP:%TFTPPORT//1009 --local-port 44444-45444
opcode: 1
-filename: /1009
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /1009
diff --git a/tests/data/test1049 b/tests/data/test1049
index e6054a478..60f41366d 100644
--- a/tests/data/test1049
+++ b/tests/data/test1049
@@ -37,8 +37,11 @@ tftp://%HOSTIP:%TFTPPORT//1049 --trace-ascii log/traceit --interface %CLIENTIP
opcode: 1
-filename: /1049
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /1049
diff --git a/tests/data/test1093 b/tests/data/test1093
index dbcfd9f7a..2087c8278 100644
--- a/tests/data/test1093
+++ b/tests/data/test1093
@@ -37,8 +37,11 @@ TFTP retrieve with mode=i
opcode: 1
-filename: /1093
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /1093
diff --git a/tests/data/test1094 b/tests/data/test1094
index 29965505f..913172260 100644
--- a/tests/data/test1094
+++ b/tests/data/test1094
@@ -43,8 +43,11 @@ TFTP retrieve with mode=netascii
opcode: 1
-filename: /1094
mode: netascii
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /1094
diff --git a/tests/data/test1099 b/tests/data/test1099
index cde403974..7aacc11d0 100644
--- a/tests/data/test1099
+++ b/tests/data/test1099
@@ -32,11 +32,17 @@ tftp://%HOSTIP:%TFTPPORT/an/invalid-file tftp://%HOSTIP:%TFTPPORT//1099 --trace-
opcode: 1
+mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
filename: an/invalid-file
-mode: octet
opcode: 1
-filename: /1099
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /1099
data for 1099
diff --git a/tests/data/test1238 b/tests/data/test1238
index 18593398a..4c976c776 100644
--- a/tests/data/test1238
+++ b/tests/data/test1238
@@ -38,8 +38,11 @@ tftp://%HOSTIP:%TFTPPORT//1238 -Y1000 -y2
opcode: 1
-filename: /1238
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /1238
# 28 = CURLE_OPERATION_TIMEDOUT
diff --git a/tests/data/test2002 b/tests/data/test2002
index f39cd60f1..db96bfea8 100644
--- a/tests/data/test2002
+++ b/tests/data/test2002
@@ -88,8 +88,11 @@ TYPE I
SIZE 20020002
RETR 20020002
opcode: 1
-filename: /20020003
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /20020003
QUIT
diff --git a/tests/data/test2003 b/tests/data/test2003
index 57c0d24e6..59a743f85 100644
--- a/tests/data/test2003
+++ b/tests/data/test2003
@@ -88,11 +88,17 @@ TYPE I
SIZE 20030002
RETR 20030002
opcode: 1
-filename: /20030003
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /20030003
opcode: 1
-filename: /20030003
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /20030003
EPSV
SIZE 20030002
RETR 20030002
diff --git a/tests/data/test2004 b/tests/data/test2004
index bad6f7b90..8035183bb 100644
--- a/tests/data/test2004
+++ b/tests/data/test2004
@@ -43,11 +43,17 @@ for several protocols
opcode: 1
-filename: /2004
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /2004
opcode: 1
-filename: /2004
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /2004
Test data file
diff --git a/tests/data/test271 b/tests/data/test271
index af5a6c603..06d5a8b43 100644
--- a/tests/data/test271
+++ b/tests/data/test271
@@ -36,8 +36,11 @@ tftp://%HOSTIP:%TFTPPORT//271 --trace-ascii log/traceit
opcode: 1
-filename: /271
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /271
diff --git a/tests/data/test283 b/tests/data/test283
index 922de51e0..0dc1270fd 100644
--- a/tests/data/test283
+++ b/tests/data/test283
@@ -17,7 +17,7 @@ tftp
TFTP retrieve on invalid file
-tftp://%HOSTIP:%TFTPPORT//invalid-file --trace-ascii log/traceit
+tftp://%HOSTIP:%TFTPPORT//invalid-file --trace-ascii log/traceit --tftp-blksize 1024
@@ -29,8 +29,11 @@ tftp://%HOSTIP:%TFTPPORT//invalid-file --trace-ascii log/traceit
opcode: 1
-filename: /invalid-file
mode: octet
+tsize: 0
+blksize: 1024
+timeout: 6
+filename: /invalid-file
diff --git a/tests/data/test284 b/tests/data/test284
index 0c2a66560..954c90260 100644
--- a/tests/data/test284
+++ b/tests/data/test284
@@ -60,8 +60,11 @@ tftp://%HOSTIP:%TFTPPORT//284 --trace-ascii log/traceit
opcode: 1
-filename: /284
mode: octet
+tsize: 0
+blksize: 512
+timeout: 6
+filename: /284
diff --git a/tests/data/test285 b/tests/data/test285
index 75a19991d..d7a4a3900 100644
--- a/tests/data/test285
+++ b/tests/data/test285
@@ -37,8 +37,11 @@ sent
opcode: 2
-filename: /test285.txt
mode: octet
+tsize: 32
+blksize: 512
+timeout: 6
+filename: /test285.txt
diff --git a/tests/data/test286 b/tests/data/test286
index 841ee1e2a..b909fd3d5 100644
--- a/tests/data/test286
+++ b/tests/data/test286
@@ -85,8 +85,11 @@ condition in the TFTP transmit code.
opcode: 2
-filename: /test286.txt
mode: octet
+tsize: 512
+blksize: 512
+timeout: 6
+filename: /test286.txt
diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c
index cef129f2e..c2c512f11 100644
--- a/tests/server/tftpd.c
+++ b/tests/server/tftpd.c
@@ -951,6 +951,8 @@ static int do_tftp(struct testcase *test, struct tftphdr *tp, ssize_t size)
#ifdef USE_WINSOCK
DWORD recvtimeout, recvtimeoutbak;
#endif
+ char *option = (char *)"mode"; /* mode is implicit */
+ int toggle = 1;
/* Open request dump file. */
server = fopen(REQUEST_DUMP, "ab");
@@ -966,22 +968,48 @@ static int do_tftp(struct testcase *test, struct tftphdr *tp, ssize_t size)
cp = (char *)&tp->th_stuff;
filename = cp;
-again:
- while (cp < &buf.storage[size]) {
- if (*cp == '\0')
+ do {
+ bool endofit = true;
+ while (cp < &buf.storage[size]) {
+ if (*cp == '\0') {
+ endofit = false;
+ break;
+ }
+ cp++;
+ }
+ if(endofit)
+ /* no more options */
break;
- cp++;
- }
+
+ /* before increasing pointer, make sure it is still within the legal
+ space */
+ if((cp+1) < &buf.storage[size]) {
+ ++cp;
+ if(first) {
+ /* store the mode since we need it later */
+ mode = cp;
+ first = 0;
+ }
+ if(toggle)
+ /* name/value pair: */
+ fprintf(server, "%s: %s\n", option, cp);
+ else {
+ /* store the name pointer */
+ option = cp;
+ }
+ toggle ^= 1;
+ }
+ else
+ /* No more options */
+ break;
+ } while(1);
+
if (*cp) {
nak(EBADOP);
fclose(server);
return 3;
}
- if (first) {
- mode = ++cp;
- first = 0;
- goto again;
- }
+
/* store input protocol */
fprintf(server, "filename: %s\n", filename);
@@ -990,7 +1018,6 @@ again:
*cp = (char)tolower((int)*cp);
/* store input protocol */
- fprintf(server, "mode: %s\n", mode);
fclose(server);
for (pf = formata; pf->f_mode; pf++)