You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2018/05/30 08:08:59 UTC

[1/6] commons-io git commit: remove IPv4 checks that are unnnecessary due to matching regex

Repository: commons-io
Updated Branches:
  refs/heads/master 7791a851c -> 81694016b


remove IPv4 checks that are unnnecessary due to matching regex


Project: http://git-wip-us.apache.org/repos/asf/commons-io/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-io/commit/fe38f889
Tree: http://git-wip-us.apache.org/repos/asf/commons-io/tree/fe38f889
Diff: http://git-wip-us.apache.org/repos/asf/commons-io/diff/fe38f889

Branch: refs/heads/master
Commit: fe38f8892a2e99cfb6b941c48a57e1415d7ab223
Parents: 0aeeb46
Author: Stefan Bodewig <st...@innoq.com>
Authored: Thu May 17 21:04:34 2018 +0200
Committer: Stefan Bodewig <st...@innoq.com>
Committed: Wed May 30 10:06:07 2018 +0200

----------------------------------------------------------------------
 .../java/org/apache/commons/io/FilenameUtils.java    | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-io/blob/fe38f889/src/main/java/org/apache/commons/io/FilenameUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/io/FilenameUtils.java b/src/main/java/org/apache/commons/io/FilenameUtils.java
index be52ea0..1493e43 100644
--- a/src/main/java/org/apache/commons/io/FilenameUtils.java
+++ b/src/main/java/org/apache/commons/io/FilenameUtils.java
@@ -1530,20 +1530,9 @@ public class FilenameUtils {
         }
 
         // verify that address subgroups are legal
-        for (int i = 1; i < 5; i++) {
+        for (int i = 1; i <= 4; i++) {
             String ipSegment = m.group(i);
-            if (ipSegment == null || ipSegment.length() == 0) {
-                return false;
-            }
-
-            int iIpSegment = 0;
-
-            try {
-                iIpSegment = Integer.parseInt(ipSegment);
-            } catch(NumberFormatException e) {
-                return false;
-            }
-
+            int iIpSegment = Integer.parseInt(ipSegment);
             if (iIpSegment > IPV4_MAX_OCTET_VALUE) {
                 return false;
             }


[2/6] commons-io git commit: isRFC3986HostName applies to IPv4 addresses so we can safe the test

Posted by bo...@apache.org.
isRFC3986HostName applies to IPv4 addresses so we can safe the test


Project: http://git-wip-us.apache.org/repos/asf/commons-io/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-io/commit/0aeeb467
Tree: http://git-wip-us.apache.org/repos/asf/commons-io/tree/0aeeb467
Diff: http://git-wip-us.apache.org/repos/asf/commons-io/diff/0aeeb467

Branch: refs/heads/master
Commit: 0aeeb46737c5e4a5d8c21c26e6793956b0296cda
Parents: e996235
Author: Stefan Bodewig <st...@innoq.com>
Authored: Thu May 17 21:03:26 2018 +0200
Committer: Stefan Bodewig <st...@innoq.com>
Committed: Wed May 30 10:06:07 2018 +0200

----------------------------------------------------------------------
 src/main/java/org/apache/commons/io/FilenameUtils.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-io/blob/0aeeb467/src/main/java/org/apache/commons/io/FilenameUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/io/FilenameUtils.java b/src/main/java/org/apache/commons/io/FilenameUtils.java
index 16ee782..be52ea0 100644
--- a/src/main/java/org/apache/commons/io/FilenameUtils.java
+++ b/src/main/java/org/apache/commons/io/FilenameUtils.java
@@ -1509,7 +1509,7 @@ public class FilenameUtils {
      * @return true if the given name is a valid host name
      */
     private static boolean isValidHostName(String name) {
-        return isIPv4Address(name) || isIPv6Address(name) || isRFC3986HostName(name);
+        return isIPv6Address(name) || isRFC3986HostName(name);
     }
 
     private static final Pattern IPV4_PATTERN =


[5/6] commons-io git commit: improve test coverage for IP address parsing code

Posted by bo...@apache.org.
improve test coverage for IP address parsing code


Project: http://git-wip-us.apache.org/repos/asf/commons-io/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-io/commit/e996235a
Tree: http://git-wip-us.apache.org/repos/asf/commons-io/tree/e996235a
Diff: http://git-wip-us.apache.org/repos/asf/commons-io/diff/e996235a

Branch: refs/heads/master
Commit: e996235aeb7908c74e85fdcdf1369a5e46672169
Parents: 71639e0
Author: Stefan Bodewig <st...@innoq.com>
Authored: Wed May 16 09:34:32 2018 +0200
Committer: Stefan Bodewig <st...@innoq.com>
Committed: Wed May 30 10:06:07 2018 +0200

----------------------------------------------------------------------
 .../apache/commons/io/FilenameUtilsTestCase.java  | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-io/blob/e996235a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
index 5888560..f9bd80d 100644
--- a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
+++ b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
@@ -249,12 +249,30 @@ public class FilenameUtilsTestCase {
 
         assertEquals(SEP + SEP + "127.0.0.1" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\127.0.0.1\\a\\b\\c.txt"));
         assertEquals(SEP + SEP + "::1" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\::1\\a\\b\\c.txt"));
+        assertEquals(SEP + SEP + "1::" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\1::\\a\\b\\c.txt"));
         assertEquals(SEP + SEP + "server.example.org" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server.example.org\\a\\b\\c.txt"));
+        assertEquals(SEP + SEP + "server.sub.example.org" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server.sub.example.org\\a\\b\\c.txt"));
         assertEquals(SEP + SEP + "server." + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server.\\a\\b\\c.txt"));
+        assertEquals(SEP + SEP + "1::127.0.0.1" + SEP + "a" + SEP + "b" + SEP + "c.txt",
+            FilenameUtils.normalize("\\\\1::127.0.0.1\\a\\b\\c.txt"));
+
+        // not valid IPv4 addresses but technically a valid "reg-name"s according to RFC1034
+        assertEquals(SEP + SEP + "127.0.0.256" + SEP + "a" + SEP + "b" + SEP + "c.txt",
+            FilenameUtils.normalize("\\\\127.0.0.256\\a\\b\\c.txt"));
+        assertEquals(SEP + SEP + "127.0.0.01" + SEP + "a" + SEP + "b" + SEP + "c.txt",
+            FilenameUtils.normalize("\\\\127.0.0.01\\a\\b\\c.txt"));
 
         assertEquals(null, FilenameUtils.normalize("\\\\-server\\a\\b\\c.txt"));
         assertEquals(null, FilenameUtils.normalize("\\\\.\\a\\b\\c.txt"));
         assertEquals(null, FilenameUtils.normalize("\\\\..\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\127.0..1\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\::1::2\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\:1\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\1:\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\1:2:3:4:5:6:7:8:9\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\g:2:3:4:5:6:7:8\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\1ffff:2:3:4:5:6:7:8\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\1:2\\a\\b\\c.txt"));
     }
 
     @Test


[4/6] commons-io git commit: checkstyle requires javadocs on private methods?

Posted by bo...@apache.org.
checkstyle requires javadocs on private methods?


Project: http://git-wip-us.apache.org/repos/asf/commons-io/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-io/commit/71639e04
Tree: http://git-wip-us.apache.org/repos/asf/commons-io/tree/71639e04
Diff: http://git-wip-us.apache.org/repos/asf/commons-io/diff/71639e04

Branch: refs/heads/master
Commit: 71639e041876e4dca28785ac3e61d80ecc33db44
Parents: 2736b6f
Author: Stefan Bodewig <st...@innoq.com>
Authored: Wed May 16 08:49:15 2018 +0200
Committer: Stefan Bodewig <st...@innoq.com>
Committed: Wed May 30 10:06:07 2018 +0200

----------------------------------------------------------------------
 .../org/apache/commons/io/FilenameUtils.java    | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-io/blob/71639e04/src/main/java/org/apache/commons/io/FilenameUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/io/FilenameUtils.java b/src/main/java/org/apache/commons/io/FilenameUtils.java
index 30f2343..16ee782 100644
--- a/src/main/java/org/apache/commons/io/FilenameUtils.java
+++ b/src/main/java/org/apache/commons/io/FilenameUtils.java
@@ -1516,6 +1516,12 @@ public class FilenameUtils {
         Pattern.compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
     private static final int IPV4_MAX_OCTET_VALUE = 255;
 
+    /**
+     * Checks whether a given string represents a valid IPv4 address.
+     *
+     * @param name the name to validate
+     * @return true if the given name is a valid IPv4 address
+     */
     // mostly copied from org.apache.commons.validator.routines.InetAddressValidator#isValidInet4Address
     private static boolean isIPv4Address(String name) {
         Matcher m = IPV4_PATTERN.matcher(name);
@@ -1557,6 +1563,12 @@ public class FilenameUtils {
     private static final int BASE_16 = 16;
 
     // copied from org.apache.commons.validator.routines.InetAddressValidator#isValidInet6Address
+    /**
+     * Checks whether a given string represents a valid IPv6 address.
+     *
+     * @param inet6Address the name to validate
+     * @return true if the given name is a valid IPv6 address
+     */
     private static boolean isIPv6Address(String inet6Address) {
         boolean containsCompressedZeroes = inet6Address.contains("::");
         if (containsCompressedZeroes && (inet6Address.indexOf("::") != inet6Address.lastIndexOf("::"))) {
@@ -1622,6 +1634,14 @@ public class FilenameUtils {
 
     private static final Pattern REG_NAME_PART_PATTERN = Pattern.compile("^[a-zA-Z0-9][a-zA-Z0-9-]*$");
 
+    /**
+     * Checks whether a given string is a valid host name according to
+     * RFC 3986 - not accepting IP addresses.
+     *
+     * @see "https://tools.ietf.org/html/rfc3986#section-3.2.2"
+     * @param name the hostname to validate
+     * @return true if the given name is a valid host name
+     */
     private static boolean isRFC3986HostName(String name) {
         String[] parts = name.split("\\.", -1);
         for (int i = 0; i < parts.length; i++) {


[3/6] commons-io git commit: IO-559 verify hostname part of suspected UNC paths in FileNameUtils

Posted by bo...@apache.org.
IO-559 verify hostname part of suspected UNC paths in FileNameUtils


Project: http://git-wip-us.apache.org/repos/asf/commons-io/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-io/commit/2736b6fe
Tree: http://git-wip-us.apache.org/repos/asf/commons-io/tree/2736b6fe
Diff: http://git-wip-us.apache.org/repos/asf/commons-io/diff/2736b6fe

Branch: refs/heads/master
Commit: 2736b6fe0b3fa22ec8e2b4184897ecadb021fc78
Parents: 7791a85
Author: Stefan Bodewig <st...@innoq.com>
Authored: Thu Dec 21 13:49:06 2017 +0100
Committer: Stefan Bodewig <st...@innoq.com>
Committed: Wed May 30 10:06:07 2018 +0200

----------------------------------------------------------------------
 .../org/apache/commons/io/FilenameUtils.java    | 147 ++++++++++++++++++-
 .../commons/io/FilenameUtilsTestCase.java       |  18 +++
 2 files changed, 164 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-io/blob/2736b6fe/src/main/java/org/apache/commons/io/FilenameUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/io/FilenameUtils.java b/src/main/java/org/apache/commons/io/FilenameUtils.java
index 51a128b..30f2343 100644
--- a/src/main/java/org/apache/commons/io/FilenameUtils.java
+++ b/src/main/java/org/apache/commons/io/FilenameUtils.java
@@ -19,8 +19,12 @@ package org.apache.commons.io;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * General file name and file path manipulation utilities.
@@ -676,7 +680,9 @@ public class FilenameUtils {
             }
             posUnix = posUnix == NOT_FOUND ? posWin : posUnix;
             posWin = posWin == NOT_FOUND ? posUnix : posWin;
-            return Math.min(posUnix, posWin) + 1;
+            int pos = Math.min(posUnix, posWin) + 1;
+            String hostnamePart = fileName.substring(2, pos - 1);
+            return isValidHostName(hostnamePart) ? pos : NOT_FOUND;
         } else {
             return isSeparator(ch0) ? 1 : 0;
         }
@@ -1490,4 +1496,143 @@ public class FilenameUtils {
         return list.toArray( new String[ list.size() ] );
     }
 
+    /**
+     * Checks whether a given string is a valid host name according to
+     * RFC 3986.
+     *
+     * <p>Accepted are IP addresses (v4 and v6) as well as what the
+     * RFC calls a "reg-name". Percent encoded names don't seem to be
+     * valid names in UNC paths.</p>
+     *
+     * @see "https://tools.ietf.org/html/rfc3986#section-3.2.2"
+     * @param name the hostname to validate
+     * @return true if the given name is a valid host name
+     */
+    private static boolean isValidHostName(String name) {
+        return isIPv4Address(name) || isIPv6Address(name) || isRFC3986HostName(name);
+    }
+
+    private static final Pattern IPV4_PATTERN =
+        Pattern.compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
+    private static final int IPV4_MAX_OCTET_VALUE = 255;
+
+    // mostly copied from org.apache.commons.validator.routines.InetAddressValidator#isValidInet4Address
+    private static boolean isIPv4Address(String name) {
+        Matcher m = IPV4_PATTERN.matcher(name);
+        if (!m.matches() || m.groupCount() != 4) {
+            return false;
+        }
+
+        // verify that address subgroups are legal
+        for (int i = 1; i < 5; i++) {
+            String ipSegment = m.group(i);
+            if (ipSegment == null || ipSegment.length() == 0) {
+                return false;
+            }
+
+            int iIpSegment = 0;
+
+            try {
+                iIpSegment = Integer.parseInt(ipSegment);
+            } catch(NumberFormatException e) {
+                return false;
+            }
+
+            if (iIpSegment > IPV4_MAX_OCTET_VALUE) {
+                return false;
+            }
+
+            if (ipSegment.length() > 1 && ipSegment.startsWith("0")) {
+                return false;
+            }
+
+        }
+
+        return true;
+    }
+
+    private static final int IPV6_MAX_HEX_GROUPS = 8;
+    private static final int IPV6_MAX_HEX_DIGITS_PER_GROUP = 4;
+    private static final int MAX_UNSIGNED_SHORT = 0xffff;
+    private static final int BASE_16 = 16;
+
+    // copied from org.apache.commons.validator.routines.InetAddressValidator#isValidInet6Address
+    private static boolean isIPv6Address(String inet6Address) {
+        boolean containsCompressedZeroes = inet6Address.contains("::");
+        if (containsCompressedZeroes && (inet6Address.indexOf("::") != inet6Address.lastIndexOf("::"))) {
+            return false;
+        }
+        if ((inet6Address.startsWith(":") && !inet6Address.startsWith("::"))
+                || (inet6Address.endsWith(":") && !inet6Address.endsWith("::"))) {
+            return false;
+        }
+        String[] octets = inet6Address.split(":");
+        if (containsCompressedZeroes) {
+            List<String> octetList = new ArrayList<String>(Arrays.asList(octets));
+            if (inet6Address.endsWith("::")) {
+                // String.split() drops ending empty segments
+                octetList.add("");
+            } else if (inet6Address.startsWith("::") && !octetList.isEmpty()) {
+                octetList.remove(0);
+            }
+            octets = octetList.toArray(new String[octetList.size()]);
+        }
+        if (octets.length > IPV6_MAX_HEX_GROUPS) {
+            return false;
+        }
+        int validOctets = 0;
+        int emptyOctets = 0; // consecutive empty chunks
+        for (int index = 0; index < octets.length; index++) {
+            String octet = octets[index];
+            if (octet.length() == 0) {
+                emptyOctets++;
+                if (emptyOctets > 1) {
+                    return false;
+                }
+            } else {
+                emptyOctets = 0;
+                // Is last chunk an IPv4 address?
+                if (index == octets.length - 1 && octet.contains(".")) {
+                    if (!isIPv4Address(octet)) {
+                        return false;
+                    }
+                    validOctets += 2;
+                    continue;
+                }
+                if (octet.length() > IPV6_MAX_HEX_DIGITS_PER_GROUP) {
+                    return false;
+                }
+                int octetInt = 0;
+                try {
+                    octetInt = Integer.parseInt(octet, BASE_16);
+                } catch (NumberFormatException e) {
+                    return false;
+                }
+                if (octetInt < 0 || octetInt > MAX_UNSIGNED_SHORT) {
+                    return false;
+                }
+            }
+            validOctets++;
+        }
+        if (validOctets > IPV6_MAX_HEX_GROUPS || (validOctets < IPV6_MAX_HEX_GROUPS && !containsCompressedZeroes)) {
+            return false;
+        }
+        return true;
+    }
+
+    private static final Pattern REG_NAME_PART_PATTERN = Pattern.compile("^[a-zA-Z0-9][a-zA-Z0-9-]*$");
+
+    private static boolean isRFC3986HostName(String name) {
+        String[] parts = name.split("\\.", -1);
+        for (int i = 0; i < parts.length; i++) {
+            if (parts[i].length() == 0) {
+                // trailing dot is legal, otherwise we've hit a .. sequence
+                return i == parts.length - 1;
+            }
+            if (!REG_NAME_PART_PATTERN.matcher(parts[i]).matches()) {
+                return false;
+            }
+        }
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/commons-io/blob/2736b6fe/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
index 5404868..5888560 100644
--- a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
+++ b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
@@ -246,6 +246,15 @@ public class FilenameUtilsTestCase {
         assertEquals(null, FilenameUtils.normalize("//server/../a"));
         assertEquals(null, FilenameUtils.normalize("//server/.."));
         assertEquals(SEP + SEP + "server" + SEP + "", FilenameUtils.normalize("//server/"));
+
+        assertEquals(SEP + SEP + "127.0.0.1" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\127.0.0.1\\a\\b\\c.txt"));
+        assertEquals(SEP + SEP + "::1" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\::1\\a\\b\\c.txt"));
+        assertEquals(SEP + SEP + "server.example.org" + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server.example.org\\a\\b\\c.txt"));
+        assertEquals(SEP + SEP + "server." + SEP + "a" + SEP + "b" + SEP + "c.txt", FilenameUtils.normalize("\\\\server.\\a\\b\\c.txt"));
+
+        assertEquals(null, FilenameUtils.normalize("\\\\-server\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\.\\a\\b\\c.txt"));
+        assertEquals(null, FilenameUtils.normalize("\\\\..\\a\\b\\c.txt"));
     }
 
     @Test
@@ -562,6 +571,15 @@ public class FilenameUtilsTestCase {
         assertEquals(1, FilenameUtils.getPrefixLength("/:foo"));
         assertEquals(1, FilenameUtils.getPrefixLength("/:/"));
         assertEquals(1, FilenameUtils.getPrefixLength("/:::::::.txt"));
+
+        assertEquals(12, FilenameUtils.getPrefixLength("\\\\127.0.0.1\\a\\b\\c.txt"));
+        assertEquals(6, FilenameUtils.getPrefixLength("\\\\::1\\a\\b\\c.txt"));
+        assertEquals(21, FilenameUtils.getPrefixLength("\\\\server.example.org\\a\\b\\c.txt"));
+        assertEquals(10, FilenameUtils.getPrefixLength("\\\\server.\\a\\b\\c.txt"));
+
+        assertEquals(-1, FilenameUtils.getPrefixLength("\\\\-server\\a\\b\\c.txt"));
+        assertEquals(-1, FilenameUtils.getPrefixLength("\\\\.\\a\\b\\c.txt"));
+        assertEquals(-1, FilenameUtils.getPrefixLength("\\\\..\\a\\b\\c.txt"));
     }
 
     @Test


[6/6] commons-io git commit: IO-559 record change, closes #52

Posted by bo...@apache.org.
IO-559 record change, closes #52


Project: http://git-wip-us.apache.org/repos/asf/commons-io/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-io/commit/81694016
Tree: http://git-wip-us.apache.org/repos/asf/commons-io/tree/81694016
Diff: http://git-wip-us.apache.org/repos/asf/commons-io/diff/81694016

Branch: refs/heads/master
Commit: 81694016b4ba3d20767a2de9808fcc358477ddc8
Parents: fe38f88
Author: Stefan Bodewig <bo...@apache.org>
Authored: Wed May 30 10:08:25 2018 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Wed May 30 10:08:25 2018 +0200

----------------------------------------------------------------------
 src/changes/changes.xml | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-io/blob/81694016/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f296eb0..81af008 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -68,6 +68,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action issue="IO-577" dev="ggregory" type="add" due-to="Gary Gregory">
         Add readers to filter out given characters: CharacterSetFilterReader and CharacterFilterReader.
       </action>
+      <action issue="IO-559" type="fix">
+        FilenameUtils.normalize now verifies hostname syntax in UNC path.
+      </action>
     </release>
 
     <release version="2.6" date="2017-10-15" description="Java 7 required, Java 9 supported.">