Fix regression in MakeRelativePath()

The logic in the function only works correctly when the
`input` and `dest` arguments are zero-terminated strings.
Changing them to std::string_view in a previous CL broke
this assumption, resulting in buffer overflows, runtime
errors with stdlib++ assertions turned on.

Fixed: 358
Change-Id: Idfb52ffcbc38943ca5c8d231fae2fd0c50f20fd3
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/16700
Reviewed-by: Takuto Ikuta <tikuta@google.com>
Commit-Queue: David Turner <digit@google.com>
Reviewed-by: David Turner <digit@google.com>
diff --git a/src/gn/filesystem_utils.cc b/src/gn/filesystem_utils.cc
index d747289..672c7f5 100644
--- a/src/gn/filesystem_utils.cc
+++ b/src/gn/filesystem_utils.cc
@@ -722,9 +722,11 @@
   size_t common_prefix_len = 0;
   size_t max_common_length = std::min(input.size(), dest.size());
   for (size_t i = common_prefix_len; i <= max_common_length; i++) {
-    if ((IsSlash(input[i]) || input[i] == '\0') && IsSlash(dest[i]))
+    if (dest.size() == i)
+      break;
+    if ((input.size() == i || IsSlash(input[i])) && IsSlash(dest[i]))
       common_prefix_len = i + 1;
-    else if (input[i] != dest[i])
+    else if (input.size() == i || input[i] != dest[i])
       break;
   }
 
@@ -736,7 +738,7 @@
 
   // Append any remaining unique input.
   if (common_prefix_len <= input.size())
-    ret.append(&input[common_prefix_len], input.size() - common_prefix_len);
+    ret.append(input.begin() + common_prefix_len, input.end());
   else if (input.back() != '/' && !ret.empty())
     ret.pop_back();