commit 9bdd68dd5c8e79a94fa4a5a69064ba33acd0b27a from: Christian Weisgerber date: Sat Jan 02 20:46:01 2021 UTC replace fparseln(3) with getline(3), for better portability ok stsp 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; }