Commit Diff


commit - e6b8b8905c5a1967c31bf6b8abed6d6b05fbff14
commit + 9bdd68dd5c8e79a94fa4a5a69064ba33acd0b27a
blob - 2cd2c5fefcbd23e58b1bef2416f1cf6133544a8e
blob + 61d4adb174d110fe882057a3c36a2e479560f756
--- lib/reference.c
+++ lib/reference.c
@@ -359,9 +359,9 @@ open_packed_ref(struct got_reference **ref, FILE *f, c
 {
 	const struct got_error *err = NULL;
 	char *abs_refname;
-	char *line;
-	size_t len;
-	const char delim[3] = {'\0', '\0', '\0'};
+	char *line = NULL;
+	size_t linesize = 0;
+	ssize_t linelen;
 	int i, ref_is_absolute = (strncmp(refname, "refs/", 5) == 0);
 
 	*ref = NULL;
@@ -369,13 +369,15 @@ open_packed_ref(struct got_reference **ref, FILE *f, c
 	if (ref_is_absolute)
 		abs_refname = (char *)refname;
 	do {
-		line = fparseln(f, &len, NULL, delim, 0);
-		if (line == NULL) {
+		linelen = getline(&line, &linesize, f);
+		if (linelen == -1) {
 			if (feof(f))
 				break;
 			err = got_ferror(f, GOT_ERR_BAD_REF_DATA);
 			break;
 		}
+		if (linelen > 0 && line[linelen - 1] == '\n')
+			line[linelen - 1] = '\0';
 		for (i = 0; i < nsubdirs; i++) {
 			if (!ref_is_absolute &&
 			    asprintf(&abs_refname, "refs/%s/%s", subdirs[i],
@@ -387,10 +389,10 @@ open_packed_ref(struct got_reference **ref, FILE *f, c
 			if (err || *ref != NULL)
 				break;
 		}
-		free(line);
 		if (err)
 			break;
 	} while (*ref == NULL);
+	free(line);
 
 	return err;
 }
@@ -871,6 +873,7 @@ got_ref_list(struct got_reflist_head *refs, struct got
 	char *packed_refs_path, *path_refs = NULL;
 	char *abs_namespace = NULL;
 	char *buf = NULL, *ondisk_ref_namespace = NULL;
+	char *line = NULL;
 	FILE *f = NULL;
 	struct got_reference *ref;
 	struct got_reflist_entry *new;
@@ -963,19 +966,19 @@ got_ref_list(struct got_reflist_head *refs, struct got
 	f = fopen(packed_refs_path, "r");
 	free(packed_refs_path);
 	if (f) {
-		char *line;
-		size_t len;
-		const char delim[3] = {'\0', '\0', '\0'};
+		size_t linesize;
+		ssize_t linelen;
 		for (;;) {
-			line = fparseln(f, &len, NULL, delim, 0);
-			if (line == NULL) {
+			linelen = getline(&line, &linesize, f);
+			if (linelen == -1) {
 				if (feof(f))
 					break;
 				err = got_ferror(f, GOT_ERR_BAD_REF_DATA);
 				goto done;
 			}
+			if (linelen > 0 && line[linelen - 1] == '\n')
+				line[linelen - 1] = '\0';
 			err = parse_packed_ref_line(&ref, NULL, line);
-			free(line);
 			if (err)
 				goto done;
 			if (ref) {
@@ -1001,6 +1004,7 @@ got_ref_list(struct got_reflist_head *refs, struct got
 done:
 	free(abs_namespace);
 	free(buf);
+	free(line);
 	free(path_refs);
 	if (f && fclose(f) != 0 && err == NULL)
 		err = got_error_from_errno("fclose");
@@ -1174,7 +1178,7 @@ delete_packed_ref(struct got_reference *delref, struct
 	const struct got_error *err = NULL, *unlock_err = NULL;
 	struct got_lockfile *lf = NULL;
 	FILE *f = NULL, *tmpf = NULL;
-	char *packed_refs_path, *tmppath = NULL;
+	char *line = NULL, *packed_refs_path, *tmppath = NULL;
 	struct got_reflist_head refs;
 	int found_delref = 0;
 
@@ -1204,21 +1208,21 @@ delete_packed_ref(struct got_reference *delref, struct
 		goto done;
 	}
 	for (;;) {
-		char *line;
-		size_t len;
-		const char delim[3] = {'\0', '\0', '\0'};
+		size_t linesize;
+		ssize_t linelen;
 		struct got_reference *ref;
 		struct got_reflist_entry *new;
 
-		line = fparseln(f, &len, NULL, delim, 0);
-		if (line == NULL) {
+		linelen = getline(&line, &linesize, f);
+		if (linelen == -1) {
 			if (feof(f))
 				break;
 			err = got_ferror(f, GOT_ERR_BAD_REF_DATA);
 			goto done;
 		}
+		if (linelen > 0 && line[linelen - 1] == '\n')
+			line[linelen - 1] = '\0';
 		err = parse_packed_ref_line(&ref, NULL, line);
-		free(line);
 		if (err)
 			goto done;
 		if (ref == NULL)
@@ -1310,6 +1314,7 @@ done:
 	}
 	free(tmppath);
 	free(packed_refs_path);
+	free(line);
 	got_ref_list_free(&refs);
 	return err ? err : unlock_err;
 }
blob - 38c6dc6f1c93d31c2b51ea0514de0fbd09d5dfc3
blob + 5dfe5fbfdef7f0419e78c3302df7d292acfa2f2e
--- lib/worktree.c
+++ lib/worktree.c
@@ -1599,13 +1599,13 @@ get_modified_file_content_status(unsigned char *status
 		GOT_DIFF_CONFLICT_MARKER_END
 	};
 	int i = 0;
-	char *line;
-	size_t len;
-	const char delim[3] = {'\0', '\0', '\0'};
+	char *line = NULL;
+	size_t linesize = 0;
+	ssize_t linelen;
 
 	while (*status == GOT_STATUS_MODIFY) {
-		line = fparseln(f, &len, NULL, delim, 0);
-		if (line == NULL) {
+		linelen = getline(&line, &linesize, f);
+		if (linelen == -1) {
 			if (feof(f))
 				break;
 			err = got_ferror(f, GOT_ERR_IO);
@@ -1620,6 +1620,7 @@ get_modified_file_content_status(unsigned char *status
 				i++;
 		}
 	}
+	free(line);
 
 	return err;
 }