diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index c84ad2af4642d727254025f4a86e5938d3da0c94..0b50fe701a681b8dbb795aa29566b9d82fd7e7ee 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -134,7 +134,7 @@ namespace pugi
 				if (lhs[i] != rhs[i])
 					return false;
 		
-			return true;
+			return lhs[count] == 0;
 		}
 		
 		// Character set pattern match.
diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp
index f5663bd5fa73879cf82011f3b76f4d5747ffdc82..6239ed2b49dbf0a92b5dd32b69d952f11d51a416 100644
--- a/src/pugixpath.cpp
+++ b/src/pugixpath.cpp
@@ -940,9 +940,7 @@ namespace pugi
 		{
 			size_t length = static_cast<size_t>(end - begin);
 
-			if (!impl::strequalrange(other, begin, length)) return false;
-			
-			return other[length] == 0;
+			return impl::strequalrange(other, begin, length);
 		}
 	};
 
diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp
index 2e6b5e3159a5fc9fa5251d1e7133fc4bfc302246..896bf6f362eb16296db43290dd2761bcdcf37635 100644
--- a/tests/test_dom_traverse.cpp
+++ b/tests/test_dom_traverse.cpp
@@ -596,6 +596,13 @@ TEST_XML(dom_node_first_element_by_path, "<node><child1>text<child2/></child1></
 
 	CHECK(doc.child(STR("node")).first_element_by_path(STR("..")) == doc);
 	CHECK(doc.child(STR("node")).first_element_by_path(STR(".")) == doc.child(STR("node")));
+
+	CHECK(doc.child(STR("node")).first_element_by_path(STR("../node/./child1/../.")) == doc.child(STR("node")));
+
+	CHECK(doc.child(STR("node")).first_element_by_path(STR("child1")) == doc.child(STR("node")).child(STR("child1")));
+	CHECK(doc.child(STR("node")).first_element_by_path(STR("child1/")) == doc.child(STR("node")).child(STR("child1")));
+	CHECK(doc.child(STR("node")).first_element_by_path(STR("child")) == xml_node());
+	CHECK(doc.child(STR("node")).first_element_by_path(STR("child11")) == xml_node());
 }
 
 struct test_walker: xml_tree_walker