{"thread":{"id":"45557","subject":"[PATCH v2] http.postbuffer: allow full range of ssize_t values","startedAt":"2017-03-30T22:23:38Z","lastAt":"2017-03-30T22:23:38Z","messageCount":1,"participants":["David Turner"],"isPatch":true,"patchVersion":2,"patchTotal":null},"messages":[{"id":"315841","messageId":"20170330222327.8858-1-dturner@twosigma.com","threadId":"45557","inReplyTo":null,"subject":"[PATCH v2] http.postbuffer: allow full range of ssize_t values","fromName":"David Turner","fromEmail":"dturner@twosigma.com","sentAt":"2017-03-30T22:23:27Z","receivedAt":"2017-03-30T22:23:38Z","isPatch":true,"sender":{"key":"novalis@novalis.org","avatar":"https://avatars.githubusercontent.com/u/77003?v=4"},"body":"Unfortunately, in order to push some large repos, the http postbuffer\nmust sometimes exceed two gigabytes.  On a 64-bit system, this is OK:\nwe just malloc a larger buffer.\n\nSigned-off-by: David Turner <dturner@twosigma.com>\n---\n cache.h  |  1 +\n config.c | 17 +++++++++++++++++\n http.c   |  4 ++--\n http.h   |  2 +-\n 4 files changed, 21 insertions(+), 3 deletions(-)\n\ndiff --git a/cache.h b/cache.h\nindex fbdf7a815a..5e6747dbb4 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -1900,6 +1900,7 @@ extern int git_parse_maybe_bool(const char *);\n extern int git_config_int(const char *, const char *);\n extern int64_t git_config_int64(const char *, const char *);\n extern unsigned long git_config_ulong(const char *, const char *);\n+extern ssize_t git_config_ssize_t(const char *, const char *);\n extern int git_config_bool_or_int(const char *, const char *, int *);\n extern int git_config_bool(const char *, const char *);\n extern int git_config_maybe_bool(const char *, const char *);\ndiff --git a/config.c b/config.c\nindex 1a4d85537b..5ead880d5b 100644\n--- a/config.c\n+++ b/config.c\n@@ -834,6 +834,15 @@ int git_parse_ulong(const char *value, unsigned long *ret)\n \treturn 1;\n }\n \n+static ssize_t git_parse_ssize_t(const char *value, ssize_t *ret)\n+{\n+\tssize_t tmp;\n+\tif (!git_parse_signed(value, &tmp, maximum_signed_value_of_type(ssize_t)))\n+\t\treturn 0;\n+\t*ret = tmp;\n+\treturn 1;\n+}\n+\n NORETURN\n static void die_bad_number(const char *name, const char *value)\n {\n@@ -892,6 +901,14 @@ unsigned long git_config_ulong(const char *name, const char *value)\n \treturn ret;\n }\n \n+ssize_t git_config_ssize_t(const char *name, const char *value)\n+{\n+\tssize_t ret;\n+\tif (!git_parse_ssize_t(value, &ret))\n+\t\tdie_bad_number(name, value);\n+\treturn ret;\n+}\n+\n int git_parse_maybe_bool(const char *value)\n {\n \tif (!value)\ndiff --git a/http.c b/http.c\nindex 96d84bbed3..22f8167ba2 100644\n--- a/http.c\n+++ b/http.c\n@@ -19,7 +19,7 @@ long int git_curl_ipresolve;\n #endif\n int active_requests;\n int http_is_verbose;\n-size_t http_post_buffer = 16 * LARGE_PACKET_MAX;\n+ssize_t http_post_buffer = 16 * LARGE_PACKET_MAX;\n \n #if LIBCURL_VERSION_NUM >= 0x070a06\n #define LIBCURL_CAN_HANDLE_AUTH_ANY\n@@ -331,7 +331,7 @@ static int http_options(const char *var, const char *value, void *cb)\n \t}\n \n \tif (!strcmp(\"http.postbuffer\", var)) {\n-\t\thttp_post_buffer = git_config_int(var, value);\n+\t\thttp_post_buffer = git_config_ssize_t(var, value);\n \t\tif (http_post_buffer < LARGE_PACKET_MAX)\n \t\t\thttp_post_buffer = LARGE_PACKET_MAX;\n \t\treturn 0;\ndiff --git a/http.h b/http.h\nindex 02bccb7b0c..f7bd3b26b0 100644\n--- a/http.h\n+++ b/http.h\n@@ -111,7 +111,7 @@ extern struct curl_slist *http_copy_default_headers(void);\n extern long int git_curl_ipresolve;\n extern int active_requests;\n extern int http_is_verbose;\n-extern size_t http_post_buffer;\n+extern ssize_t http_post_buffer;\n extern struct credential http_auth;\n \n extern char curl_errorstr[CURL_ERROR_SIZE];\n-- \n2.11.GIT\n\n"}]}