]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
netrc: skip 'macdef' definitions
authorDaniel Stenberg <daniel@haxx.se>
Fri, 11 Jun 2021 14:19:27 +0000 (16:19 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 13 Jun 2021 21:44:41 +0000 (23:44 +0200)
Add test 494 to verify

Reported-by: Harry Sintonen
Fixes #7238
Closes #7244

lib/netrc.c
tests/data/Makefile.inc
tests/data/test494 [new file with mode: 0644]

index 13610bb070e8e7d1b8488c0f865a0d2a69e0da65..0a4ae2cdcaf4690a3f107c2e6377fa9308090361 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -42,7 +42,8 @@
 enum host_lookup_state {
   NOTHING,
   HOSTFOUND,    /* the 'machine' keyword was found */
-  HOSTVALID     /* this is "our" machine! */
+  HOSTVALID,    /* this is "our" machine! */
+  MACDEF
 };
 
 #define NETRC_FILE_MISSING 1
@@ -84,12 +85,17 @@ static int parsenetrc(const char *host,
     int  netrcbuffsize = (int)sizeof(netrcbuffer);
 
     while(!done && fgets(netrcbuffer, netrcbuffsize, file)) {
+      if(state == MACDEF) {
+        if((netrcbuffer[0] == '\n') || (netrcbuffer[0] == '\r'))
+          state = NOTHING;
+        else
+          continue;
+      }
       tok = strtok_r(netrcbuffer, " \t\n", &tok_buf);
       if(tok && *tok == '#')
         /* treat an initial hash as a comment line */
         continue;
       while(tok) {
-
         if((login && *login) && (password && *password)) {
           done = TRUE;
           break;
@@ -97,7 +103,13 @@ static int parsenetrc(const char *host,
 
         switch(state) {
         case NOTHING:
-          if(strcasecompare("machine", tok)) {
+          if(strcasecompare("macdef", tok)) {
+            /* Define a macro. A macro is defined with the specified name; its
+               contents begin with the next .netrc line and continue until a
+               null line (consecutive new-line characters) is encountered. */
+            state = MACDEF;
+          }
+          else if(strcasecompare("machine", tok)) {
             /* the next tok is the machine name, this is in itself the
                delimiter that starts the stuff entered for this machine,
                after this we need to search for 'login' and
@@ -109,6 +121,11 @@ static int parsenetrc(const char *host,
             retcode = NETRC_SUCCESS; /* we did find our host */
           }
           break;
+        case MACDEF:
+          if(!strlen(tok)) {
+            state = NOTHING;
+          }
+          break;
         case HOSTFOUND:
           if(strcasecompare(host, tok)) {
             /* and yes, this is our host! */
index d39773354a6340c08a48ff2b6640ff0e72f30293..271e5348c3973ab44db8054c9e26f3e0ecca41c5 100644 (file)
@@ -69,7 +69,7 @@ test409 test410 \
 \
 test430 test431 test432 test433 test434 \
 \
-test490 test491 test492 test493 \
+test490 test491 test492 test493 test494 \
 \
 test500 test501 test502 test503 test504 test505 test506 test507 test508 \
 test509 test510 test511 test512 test513 test514 test515 test516 test517 \
diff --git a/tests/data/test494 b/tests/data/test494
new file mode 100644 (file)
index 0000000..4417446
--- /dev/null
@@ -0,0 +1,60 @@
+<testcase>
+<info>
+<keywords>
+FTP
+EPSV
+netrc
+macdef
+</keywords>
+</info>
+#
+# Server-side
+<reply>
+<data>
+blipp
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+ftp
+</server>
+ <name>
+skip 'macdef' when parsing netrc
+ </name>
+ <command>
+--netrc --netrc-file log/netrc%TESTNUMBER ftp://%HOSTIP:%FTPPORT/%TESTNUMBER
+</command>
+<file name="log/netrc%TESTNUMBER" >
+
+macdef testmacro
+       bin
+       cd default
+       cd login
+       put login.bin
+       cd ..
+       cd password
+       put password.bin
+       quit
+
+machine %HOSTIP login user1 password passwd1
+</file>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+USER user1\r
+PASS passwd1\r
+PWD\r
+EPSV\r
+TYPE I\r
+SIZE %TESTNUMBER\r
+RETR %TESTNUMBER\r
+QUIT\r
+</protocol>
+</verify>
+</testcase>