http: fix build error on FreeBSD
The `result` parameter passed to `http_request_reauth()` may either point to a `struct strbuf` or a `FILE *`, where the `target` parameter tells us which of either it actually is. To accommodate for both types the pointer is a `void *`, which we then pass directly to functions without doing a cast. This is fine on most platforms, but it breaks on FreeBSD because `fileno()` is implemented as a macro that tries to directly access the `FILE *` structure. Fix this issue by storing the `FILE *` in a local variable before we pass it on to other functions. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Taylor Blau <me@ttaylorr.com>
This commit is contained in:

committed by
Taylor Blau

parent
87ad2a9d56
commit
80ebd91b83
10
http.c
10
http.c
@ -2290,17 +2290,19 @@ static int http_request_reauth(const char *url,
|
|||||||
case HTTP_REQUEST_STRBUF:
|
case HTTP_REQUEST_STRBUF:
|
||||||
strbuf_reset(result);
|
strbuf_reset(result);
|
||||||
break;
|
break;
|
||||||
case HTTP_REQUEST_FILE:
|
case HTTP_REQUEST_FILE: {
|
||||||
if (fflush(result)) {
|
FILE *f = result;
|
||||||
|
if (fflush(f)) {
|
||||||
error_errno("unable to flush a file");
|
error_errno("unable to flush a file");
|
||||||
return HTTP_START_FAILED;
|
return HTTP_START_FAILED;
|
||||||
}
|
}
|
||||||
rewind(result);
|
rewind(f);
|
||||||
if (ftruncate(fileno(result), 0) < 0) {
|
if (ftruncate(fileno(f), 0) < 0) {
|
||||||
error_errno("unable to truncate a file");
|
error_errno("unable to truncate a file");
|
||||||
return HTTP_START_FAILED;
|
return HTTP_START_FAILED;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
BUG("Unknown http_request target");
|
BUG("Unknown http_request target");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user