refs.c: make resolve_ref_unsafe set errno to something meaningful on error
Making errno when returning from resolve_ref_unsafe() meaningful, which should fix * a bug in lock_ref_sha1_basic, where it assumes EISDIR means it failed due to a directory being in the way Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Acked-by: Michael Haggerty <mhagger@alum.mit.edu>
Ronnie Sahlberg committed
Jun 20, 2014 at 07:42 UTC
76d70dc0c63fe89958308f249136864aec5cdf03
2 files changed
+16
-5
cache.h
+1
-1
@@ -979,7 +979,7 @@ extern int read_ref(const char *refname, unsigned char *sha1);
979
* NULL. If more than MAXDEPTH recursive symbolic lookups are needed,
980
* give up and return NULL.
981
*
982
- * errno is sometimes set on errors, but not always.
982
+ * errno is set to something meaningful on error.
983
*/
984
extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int reading, int *flag);
985
extern char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag);
refs.c
+15
-4
@@ -1334,6 +1334,7 @@ static const char *handle_missing_loose_ref(const char *refname,
1334
}
1335
}
1336
1337
+/* This function needs to return a meaningful errno on failure */
1338
const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int reading, int *flag)
1339
{
1340
int depth = MAXDEPTH;
@@ -1344,8 +1345,10 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea
1345
if (flag)
1346
*flag = 0;
1347
1347
- if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
1348
+ if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1349
+ errno = EINVAL;
1350
return NULL;
1351
+ }
1352
1353
for (;;) {
1354
char path[PATH_MAX];
@@ -1353,8 +1356,10 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea
1356
char *buf;
1357
int fd;
1358
1356
- if (--depth < 0)
1359
+ if (--depth < 0) {
1360
+ errno = ELOOP;
1361
return NULL;
1362
+ }
1363
1364
git_snpath(path, sizeof(path), "%s", refname);
1365
@@ -1416,9 +1421,13 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea
1421
return NULL;
1422
}
1423
len = read_in_full(fd, buffer, sizeof(buffer)-1);
1419
- close(fd);
1420
- if (len < 0)
1424
+ if (len < 0) {
1425
+ int save_errno = errno;
1426
+ close(fd);
1427
+ errno = save_errno;
1428
return NULL;
1429
+ }
1430
+ close(fd);
1431
while (len && isspace(buffer[len-1]))
1432
len--;
1433
buffer[len] = '\0';
@@ -1435,6 +1444,7 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea
1444
(buffer[40] != '\0' && !isspace(buffer[40]))) {
1445
if (flag)
1446
*flag |= REF_ISBROKEN;
1447
+ errno = EINVAL;
1448
return NULL;
1449
}
1450
return refname;
@@ -1447,6 +1457,7 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea
1457
if (check_refname_format(buf, REFNAME_ALLOW_ONELEVEL)) {
1458
if (flag)
1459
*flag |= REF_ISBROKEN;
1460
+ errno = EINVAL;
1461
return NULL;
1462
}
1463
refname = strcpy(refname_buffer, buf);