Commit Diff


commit - 871b5bb7caa2a9144d00f5f4711c18aa861bce88
commit + f5bc8482f4f41abd20e767dd613fc323713f3820
blob - d1961d58cf839e88952aebcdaae46b7be773e5fa
blob + 152a34c6023838c2691b4cd1052849df3caeeccb
--- iri.c
+++ iri.c
@@ -572,13 +572,16 @@ iri_parse(const char *base, const char *str, struct ir
 
 	if (base == NULL) {
 		ibase.iri_flags = 0;
-		if (parse_uri(str, &iparsed) == -1)
+		if (parse_uri(str, &iparsed) == -1) {
+			errno = EINVAL;
 			return (-1);
+		}
 	} else {
-		if (parse_uri(base, &ibase) == -1)
-			return (-1);
-		if (parse(str, &iparsed) == -1)
+		if (parse_uri(base, &ibase) == -1 ||
+		    parse(str, &iparsed) == -1) {
+			errno = EINVAL;
 			return (-1);
+		}
 	}
 
 	if (iparsed.iri_flags & IH_SCHEME) {
@@ -616,10 +619,11 @@ iri_parse(const char *base, const char *str, struct ir
 			ibase.iri_path[0] = '\0';
 		if (!(iparsed.iri_flags & IH_PATH))
 			iparsed.iri_path[0] = '\0';
-		mergepath(iri->iri_path, sizeof(iri->iri_path),
-		    ibase.iri_path, iparsed.iri_path);
+		if (mergepath(iri, &ibase, &iparsed) == -1)
+			return (-1);
 	}
-	remove_dot_segments(iri);
+	if (remove_dot_segments(iri) == -1)
+		return (-1);
 	cpfields(iri, &ibase, IH_QUERY);
 	return (0);
 }