resolve_ref_unsafe(): ensure flags is always set
If the caller passes flags==NULL, then set it to point at a local scratch variable. This removes the need for a lot of "if (flags)" guards in resolve_ref_1() and resolve_missing_loose_ref(). Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: David Turner <dturner@twopensource.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Michael Haggerty committed
Apr 7, 2016 at 15:02 UTC
a70a93b7947d3aa6a202342256e616460a2b6e5b
1 file changed
+13
-18
refs/files-backend.c
+13
-18
@@ -1383,8 +1383,7 @@ static int resolve_missing_loose_ref(const char *refname,
1383
entry = get_packed_ref(refname);
1384
if (entry) {
1385
hashcpy(sha1, entry->u.value.oid.hash);
1386
- if (flags)
1387
- *flags |= REF_ISPACKED;
1386
+ *flags |= REF_ISPACKED;
1387
return 0;
1388
}
1389
/* refname is not a packed reference. */
@@ -1403,12 +1402,10 @@ static const char *resolve_ref_1(const char *refname,
1402
int bad_name = 0;
1403
int symref_count;
1404
1406
- if (flags)
1407
- *flags = 0;
1405
+ *flags = 0;
1406
1407
if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1410
- if (flags)
1411
- *flags |= REF_BAD_NAME;
1408
+ *flags |= REF_BAD_NAME;
1409
1410
if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1411
!refname_is_safe(refname)) {
@@ -1458,8 +1455,7 @@ static const char *resolve_ref_1(const char *refname,
1455
}
1456
if (bad_name) {
1457
hashclr(sha1);
1461
- if (flags)
1462
- *flags |= REF_ISBROKEN;
1458
+ *flags |= REF_ISBROKEN;
1459
}
1460
return refname;
1461
}
@@ -1478,8 +1474,7 @@ static const char *resolve_ref_1(const char *refname,
1474
!check_refname_format(sb_contents->buf, 0)) {
1475
strbuf_swap(sb_refname, sb_contents);
1476
refname = sb_refname->buf;
1481
- if (flags)
1482
- *flags |= REF_ISSYMREF;
1477
+ *flags |= REF_ISSYMREF;
1478
if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
1479
hashclr(sha1);
1480
return refname;
@@ -1526,20 +1521,17 @@ static const char *resolve_ref_1(const char *refname,
1521
*/
1522
if (get_sha1_hex(sb_contents->buf, sha1) ||
1523
(sb_contents->buf[40] != '\0' && !isspace(sb_contents->buf[40]))) {
1529
- if (flags)
1530
- *flags |= REF_ISBROKEN;
1524
+ *flags |= REF_ISBROKEN;
1525
errno = EINVAL;
1526
return NULL;
1527
}
1528
if (bad_name) {
1529
hashclr(sha1);
1536
- if (flags)
1537
- *flags |= REF_ISBROKEN;
1530
+ *flags |= REF_ISBROKEN;
1531
}
1532
return refname;
1533
}
1541
- if (flags)
1542
- *flags |= REF_ISSYMREF;
1534
+ *flags |= REF_ISSYMREF;
1535
buf = sb_contents->buf + 4;
1536
while (isspace(*buf))
1537
buf++;
@@ -1551,8 +1543,7 @@ static const char *resolve_ref_1(const char *refname,
1543
return refname;
1544
}
1545
if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
1554
- if (flags)
1555
- *flags |= REF_ISBROKEN;
1546
+ *flags |= REF_ISBROKEN;
1547
1548
if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1549
!refname_is_safe(buf)) {
@@ -1573,8 +1564,12 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
1564
static struct strbuf sb_refname = STRBUF_INIT;
1565
struct strbuf sb_contents = STRBUF_INIT;
1566
struct strbuf sb_path = STRBUF_INIT;
1567
+ int unused_flags;
1568
const char *ret;
1569
1570
+ if (!flags)
1571
+ flags = &unused_flags;
1572
+
1573
ret = resolve_ref_1(refname, resolve_flags, sha1, flags,
1574
&sb_refname, &sb_path, &sb_contents);
1575
strbuf_release(&sb_path);