/**
                         * Remap spaces and periods found at the end of every
                         * component of the path. The special cases of '.' and
-                        * '..' do not need to be dealt with explicitly because
-                        * they are addressed in namei.c:link_path_walk().
+                        * '..' are need to be handled because of symlinks.
+                        * They are treated as non-end-of-string to avoid
+                        * remapping and breaking symlinks pointing to . or ..
                         **/
-                       if ((i == srclen - 1) || (source[i+1] == '\\'))
+                       if ((i == 0 || source[i-1] == '\\') &&
+                           source[i] == '.' &&
+                           (i == srclen-1 || source[i+1] == '\\'))
+                               end_of_string = false; /* "." case */
+                       else if (i >= 1 &&
+                                (i == 1 || source[i-2] == '\\') &&
+                                source[i-1] == '.' &&
+                                source[i] == '.' &&
+                                (i == srclen-1 || source[i+1] == '\\'))
+                               end_of_string = false; /* ".." case */
+                       else if ((i == srclen - 1) || (source[i+1] == '\\'))
                                end_of_string = true;
                        else
                                end_of_string = false;