Result summary


Project: git
Run: 123
Result: 52
Scanner: C File I/O
Kind: Leaked file (Error FIO1)
Status: New
Filename: fetch.c
Function: store_updated_refs
Line: 383
Navigate: Event 1

Result details


270: */
271: sprintf(display, _("! %-*s %-*s -> %s (can't fetch in current branch)"),
272: TRANSPORT_SUMMARY_WIDTH, _("[rejected]"), REFCOL_WIDTH, remote,
273: pretty_ref);
274: return 1;
275: }
276:
277: if (!is_null_sha1(ref->old_sha1) &&
278: !prefixcmp(ref->name, "refs/tags/")) {
279: int r;
280: r = s_update_ref("updating tag", ref, 0);
281: sprintf(display, "%c %-*s %-*s -> %s%s", r ? '!' : '-',
282: TRANSPORT_SUMMARY_WIDTH, _("[tag update]"), REFCOL_WIDTH, remote,
283: pretty_ref, r ? _(" (unable to update local ref)") : "");
284: return r;
285: }
286:
287: current = lookup_commit_reference_gently(ref->old_sha1, 1);
288: updated = lookup_commit_reference_gently(ref->new_sha1, 1);
289: if (!current || !updated) {
290: const char *msg;
291: const char *what;
292: int r;
293: if (!strncmp(ref->name, "refs/tags/", 10)) {
294: msg = "storing tag";
295: what = _("[new tag]");
296: }
297: else {
298: msg = "storing head";
299: what = _("[new branch]");
300: if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
301: (recurse_submodules != RECURSE_SUBMODULES_ON))
302: check_for_new_submodule_commits(ref->new_sha1);
303: }
304:
305: r = s_update_ref(msg, ref, 0);
306: sprintf(display, "%c %-*s %-*s -> %s%s", r ? '!' : '*',
307: TRANSPORT_SUMMARY_WIDTH, what, REFCOL_WIDTH, remote, pretty_ref,
308: r ? _(" (unable to update local ref)") : "");
309: return r;
310: }
311:
312: if (in_merge_bases(current, &updated, 1)) {
313: char quickref[83];
314: int r;
315: strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
316: strcat(quickref, "..");
317: strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
318: if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
319: (recurse_submodules != RECURSE_SUBMODULES_ON))
320: check_for_new_submodule_commits(ref->new_sha1);
321: r = s_update_ref("fast-forward", ref, 1);
322: sprintf(display, "%c %-*s %-*s -> %s%s", r ? '!' : ' ',
323: TRANSPORT_SUMMARY_WIDTH, quickref, REFCOL_WIDTH, remote,
324: pretty_ref, r ? _(" (unable to update local ref)") : "");
325: return r;
326: } else if (force || ref->force) {
327: char quickref[84];
328: int r;
329: strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
330: strcat(quickref, "...");
331: strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
332: if ((recurse_submodules != RECURSE_SUBMODULES_OFF) &&
333: (recurse_submodules != RECURSE_SUBMODULES_ON))
334: check_for_new_submodule_commits(ref->new_sha1);
335: r = s_update_ref("forced-update", ref, 1);
336: sprintf(display, "%c %-*s %-*s -> %s (%s)", r ? '!' : '+',
337: TRANSPORT_SUMMARY_WIDTH, quickref, REFCOL_WIDTH, remote,
338: pretty_ref,
339: r ? _("unable to update local ref") : _("forced update"));
340: return r;
341: } else {
342: sprintf(display, "! %-*s %-*s -> %s %s",
343: TRANSPORT_SUMMARY_WIDTH, _("[rejected]"), REFCOL_WIDTH, remote,
344: pretty_ref, _("(non-fast-forward)"));
345: return 1;
346: }
347: }
348:
349: static int iterate_ref_map(void *cb_data, unsigned char sha1[20])
350: {
351: struct ref **rm = cb_data;
352: struct ref *ref = *rm;
353:
354: if (!ref)
355: return -1; /* end of the list */
356: *rm = ref->next;
357: hashcpy(sha1, ref->old_sha1);
358: return 0;
359: }
360:
361: static int store_updated_refs(const char *raw_url, const char *remote_name,
362: struct ref *ref_map)
363: {
364: FILE *fp;
365: struct commit *commit;
366: int url_len, i, note_len, shown_url = 0, rc = 0;
367: char note[1024];
368: const char *what, *kind;
369: struct ref *rm;

Event 1

Taking false path at expression: dry_run
370: char *url, *filename = dry_run ? "/dev/null" : git_path("FETCH_HEAD");
371:

Event 2

File handle fp opened
Navigate: (previous) (next)
372: fp = fopen(filename, "a");

Event 3

File handle fp compared with NULL
Navigate: (previous) (next)

Event 4

Taking false path at expression: !fp
Navigate: (previous) (next)
373: if (!fp)
374: return error(_("cannot open %s: %s\n"), filename, strerror(errno));
375:

Event 5

Taking false path at expression: raw_url
Navigate: (previous) (next)
376: if (raw_url)
377: url = transport_anonymize_url(raw_url);
378: else
379: url = xstrdup("foreign");
380:
381: rm = ref_map;

Event 6

Taking true path at expression: check_everything_connected(iterate_ref_map, 0, &rm)
Navigate: (previous) (next)
382: if (check_everything_connected(iterate_ref_map, 0, &rm))

Event 7

Error: File handle fp leaked
Navigate: (previous) (next)
383: return error(_("%s did not send all necessary objects\n"), url);
384:
385: for (rm = ref_map; rm; rm = rm->next) {
386: struct ref *ref = NULL;
387:
388: if (rm->peer_ref) {
389: ref = xcalloc(1, sizeof(*ref) + strlen(rm->peer_ref->name) + 1);
390: strcpy(ref->name, rm->peer_ref->name);
391: hashcpy(ref->old_sha1, rm->peer_ref->old_sha1);
392: hashcpy(ref->new_sha1, rm->old_sha1);
393: ref->force = rm->peer_ref->force;
394: }
395:
396: commit = lookup_commit_reference_gently(rm->old_sha1, 1);
397: if (!commit)
398: rm->merge = 0;
399:
400: if (!strcmp(rm->name, "HEAD")) {
401: kind = "";
402: what = "";
403: }
404: else if (!prefixcmp(rm->name, "refs/heads/")) {
405: kind = "branch";
406: what = rm->name + 11;
407: }
408: else if (!prefixcmp(rm->name, "refs/tags/")) {
409: kind = "tag";
410: what = rm->name + 10;
411: }
412: else if (!prefixcmp(rm->name, "refs/remotes/")) {
413: kind = "remote-tracking branch";
414: what = rm->name + 13;
415: }
416: else {
417: kind = "";
418: what = rm->name;
419: }
420:
421: url_len = strlen(url);
422: for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
423: ;
424: url_len = i + 1;
425: if (4 < i && !strncmp(".git", url + i - 3, 4))
426: url_len = i - 3;
427:
428: note_len = 0;
429: if (*what) {
430: if (*kind)
431: note_len += sprintf(note + note_len, "%s ",
432: kind);
433: note_len += sprintf(note + note_len, "'%s' of ", what);
434: }
435: note[note_len] = '\0';
436: fprintf(fp, "%s\t%s\t%s",
437: sha1_to_hex(commit ? commit->object.sha1 :
438: rm->old_sha1),
439: rm->merge ? "" : "not-for-merge",
440: note);
441: for (i = 0; i < url_len; ++i)
442: if ('\n' == url[i])
443: fputs("\\n", fp);
444: else
445: fputc(url[i], fp);
446: fputc('\n', fp);
447:
448: if (ref) {
449: rc |= update_local_ref(ref, what, note);
450: free(ref);
451: } else
452: sprintf(note, "* %-*s %-*s -> FETCH_HEAD",
453: TRANSPORT_SUMMARY_WIDTH, *kind ? kind : "branch",
454: REFCOL_WIDTH, *what ? what : "HEAD");
455: if (*note) {
456: if (verbosity >= 0 && !shown_url) {
457: fprintf(stderr, _("From %.*s\n"),
458: url_len, url);
459: shown_url = 1;
460: }
461: if (verbosity >= 0)
462: fprintf(stderr, " %s\n", note);
463: }
464: }
465: free(url);
466: fclose(fp);
467: if (rc & STORE_REF_ERROR_DF_CONFLICT)
468: error(_("some local refs could not be updated; try running\n"
469: " 'git remote prune %s' to remove any old, conflicting "
470: "branches"), remote_name);
471: return rc;
472: }
473:
474: /*
475: * We would want to bypass the object transfer altogether if
476: * everything we are going to fetch already exists and is connected
477: * locally.
478: */
479: static int quickfetch(struct ref *ref_map)
480: {
481: struct ref *rm = ref_map;
482:
483: /*