You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2007/10/03 06:43:50 UTC

svn commit: r581493 - in /httpd/mod_ftp/trunk: include/mod_ftp.h modules/ftp/ftp_util.c

Author: wrowe
Date: Tue Oct  2 21:43:49 2007
New Revision: 581493

URL: http://svn.apache.org/viewvc?rev=581493&view=rev
Log:
We require a new parser, apr_eprt_decode() to break apart |AF|IP|port|
sequences.  This isn't quite a generic parser, all three elts are 
manditory.  We do not try to validate IP yet for completeness, only
that it matches digits and the appropriate IP elt seperators.

Modified:
    httpd/mod_ftp/trunk/include/mod_ftp.h
    httpd/mod_ftp/trunk/modules/ftp/ftp_util.c

Modified: httpd/mod_ftp/trunk/include/mod_ftp.h
URL: http://svn.apache.org/viewvc/httpd/mod_ftp/trunk/include/mod_ftp.h?rev=581493&r1=581492&r2=581493&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/include/mod_ftp.h (original)
+++ httpd/mod_ftp/trunk/include/mod_ftp.h Tue Oct  2 21:43:49 2007
@@ -401,6 +401,8 @@
  *
  * ftp_util.c
  */
+int ftp_eprt_decode(apr_int32_t *family, char **addr, apr_port_t *port,
+                    char *arg);
 struct ftp_direntry *ftp_direntry_get(request_rec *r, const char *pattern);
 
 void ftp_set_authorization(request_rec *r);

Modified: httpd/mod_ftp/trunk/modules/ftp/ftp_util.c
URL: http://svn.apache.org/viewvc/httpd/mod_ftp/trunk/modules/ftp/ftp_util.c?rev=581493&r1=581492&r2=581493&view=diff
==============================================================================
--- httpd/mod_ftp/trunk/modules/ftp/ftp_util.c (original)
+++ httpd/mod_ftp/trunk/modules/ftp/ftp_util.c Tue Oct  2 21:43:49 2007
@@ -29,6 +29,69 @@
 #include <sys/stat.h> /* For file perms */
 
 
+/* Warning; the *arg is consumed, manipulated and must have the same lifetime
+ * as the desired *addr results!
+ */
+int ftp_eprt_decode(apr_int32_t *family, char **addr, apr_port_t *port,
+                    char *arg)
+{
+    char *argv, delim = *arg, sep = '\0';
+
+    if (delim <= ' ' || delim > 126)
+        return FTP_REPLY_SYNTAX_ERROR;
+
+    ++arg;
+    argv = arg;
+    while (isdigit(*arg)) ++arg;
+    if (*arg != delim)
+        return FTP_REPLY_SYNTAX_ERROR;
+    *(arg++) = '\0';
+    if (*argv) {
+        if (strcmp(argv, "1") == 0)
+            *family = APR_INET;
+#if APR_HAVE_IPV6
+        else if (strcmp(argv, "2") == 0)
+            *family = APR_INET6;
+#endif
+        else if (isdigit(argv[0]))
+            return FTP_REPLY_BAD_PROTOCOL;
+        else
+            return FTP_REPLY_SYNTAX_ERROR;
+    }
+
+    if (*family == APR_INET)
+        sep = '.';
+#if APR_HAVE_IPV6
+    else if (*family == APR_INET6)
+        sep = ':';
+#endif
+    else
+        return FTP_REPLY_BAD_PROTOCOL;
+    
+    argv = arg;
+    if (*arg == delim)
+        return FTP_REPLY_SYNTAX_ERROR;
+    while (isdigit(*arg) || (*arg == sep)) ++arg;
+    if (*arg != delim)
+        return FTP_REPLY_SYNTAX_ERROR;
+    *(arg++) = '\0';
+    *addr = argv;
+
+    argv = arg;
+    if (*arg == delim)
+        return FTP_REPLY_SYNTAX_ERROR;
+    while (isdigit(*arg)) ++arg;
+    if (*arg != delim)
+        return FTP_REPLY_SYNTAX_ERROR;
+    *(arg++) = '\0';
+    if (*argv)
+        *port = atoi(argv);
+
+    if (*arg)
+        return FTP_REPLY_SYNTAX_ERROR;
+    return FTP_REPLY_COMMAND_OK;
+}
+
 static char *ftp_modestring_get(char *mode, apr_filetype_e typ, 
                                       apr_fileperms_t perms)
 {