Skip to content

Commit 898c264

Browse files
committed
compat/snprintf: keep errno when the call succeeds
for example in t0410-partial-clone: ++ git -C repo fsck Checking object directories: 100% (256/256), done. Checking objects: 100% (1/1), done. fatal: failed to read object 383670739c2f993999f3c10911ac5cb5c6591523: Result too large when it should be Checking object directories: 100% (256/256), done. Checking objects: 100% (1/1), done. dangling tag e5f4cb9fd329c512b08fb81a8e6b1f5e27658263
1 parent 2523dc9 commit 898c264

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

compat/snprintf.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
2222
va_list cp;
2323
char *s;
2424
int ret = -1;
25+
int save_errno = errno;
2526

2627
if (maxsize > 0) {
2728
va_copy(cp, ap);
@@ -33,7 +34,7 @@ int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
3334
str[maxsize-1] = 0;
3435
}
3536
if (ret != -1)
36-
return ret;
37+
goto out;
3738

3839
s = NULL;
3940
if (maxsize < 128)
@@ -42,8 +43,10 @@ int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
4243
while (ret == -1) {
4344
maxsize *= 4;
4445
str = realloc(s, maxsize);
45-
if (! str)
46+
if (!str) {
47+
save_errno = ENOMEM;
4648
break;
49+
}
4750
s = str;
4851
va_copy(cp, ap);
4952
ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, cp);
@@ -52,6 +55,8 @@ int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
5255
ret = -1;
5356
}
5457
free(s);
58+
out:
59+
errno = save_errno;
5560
return ret;
5661
}
5762

0 commit comments

Comments
 (0)