summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Martí <tanoku@gmail.com>2011-09-22 10:28:05 -0700
committerVicent Martí <tanoku@gmail.com>2011-09-22 10:28:05 -0700
commit01ab592b82c4051df2be6066d7dfa59696cd453d (patch)
tree934a6951ee3d005395a8632197d7fb1722a216bb /src
parent87a26ad55e3d7a7b4753a9cf70f1481f2c61b2cd (diff)
parentad196c6ae669e2d69503eba942402e7215ea7b82 (diff)
downloadlibgit2-01ab592b82c4051df2be6066d7dfa59696cd453d.tar.gz
Merge pull request #421 from nulltoken/ntk/fix/config-get-set-long
config: make git_config_[get|set]_long() able to properly deal with 8 bytes wide values
Diffstat (limited to 'src')
-rw-r--r--src/config.c32
-rw-r--r--src/index.c4
-rw-r--r--src/pkt.c2
-rw-r--r--src/revwalk.c2
-rw-r--r--src/signature.c4
-rw-r--r--src/tree.c2
-rw-r--r--src/util.c21
-rw-r--r--src/util.h3
8 files changed, 47 insertions, 23 deletions
diff --git a/src/config.c b/src/config.c
index 261beb425..e34acba9a 100644
--- a/src/config.c
+++ b/src/config.c
@@ -161,16 +161,16 @@ int git_config_delete(git_config *cfg, const char *name)
* Setters
**************/
-int git_config_set_long(git_config *cfg, const char *name, long int value)
+int git_config_set_long(git_config *cfg, const char *name, long long value)
{
char str_value[32]; /* All numbers should fit in here */
- p_snprintf(str_value, sizeof(str_value), "%ld", value);
+ p_snprintf(str_value, sizeof(str_value), "%lld", value);
return git_config_set_string(cfg, name, str_value);
}
int git_config_set_int(git_config *cfg, const char *name, int value)
{
- return git_config_set_long(cfg, name, value);
+ return git_config_set_long(cfg, name, (long long)value);
}
int git_config_set_bool(git_config *cfg, const char *name, int value)
@@ -196,19 +196,19 @@ int git_config_set_string(git_config *cfg, const char *name, const char *value)
* Getters
***********/
-int git_config_get_long(git_config *cfg, const char *name, long int *out)
+int git_config_get_long(git_config *cfg, const char *name, long long *out)
{
const char *value, *num_end;
int ret;
- long int num;
+ long long num;
ret = git_config_get_string(cfg, name, &value);
if (ret < GIT_SUCCESS)
- return git__rethrow(ret, "Failed to get value for %s", name);
+ return git__rethrow(ret, "Failed to retrieve value for '%s'", name);
- ret = git__strtol32(&num, value, &num_end, 0);
+ ret = git__strtol64(&num, value, &num_end, 0);
if (ret < GIT_SUCCESS)
- return git__rethrow(ret, "Failed to get value for %s", name);
+ return git__rethrow(ret, "Failed to convert value for '%s'", name);
switch (*num_end) {
case '\0':
@@ -226,7 +226,7 @@ int git_config_get_long(git_config *cfg, const char *name, long int *out)
num *= 1024 * 1024 * 1024;
break;
default:
- return git__throw(GIT_EINVALIDTYPE, "Failed to get value for %s. Value is of invalid type", name);
+ return git__throw(GIT_EINVALIDTYPE, "Failed to get value for '%s'. Value is of invalid type", name);
}
*out = num;
@@ -236,12 +236,18 @@ int git_config_get_long(git_config *cfg, const char *name, long int *out)
int git_config_get_int(git_config *cfg, const char *name, int *out)
{
- long int tmp;
- int ret;
+ long long tmp_long;
+ int tmp_int, ret;
- ret = git_config_get_long(cfg, name, &tmp);
+ ret = git_config_get_long(cfg, name, &tmp_long);
+ if (ret < GIT_SUCCESS)
+ return git__rethrow(ret, "Failed to convert value for '%s'", name);
+
+ tmp_int = tmp_long & 0xFFFFFFFF;
+ if (tmp_int != tmp_long)
+ return git__throw(GIT_EOVERFLOW, "Value for '%s' is too large", name);
- *out = (int) tmp;
+ *out = tmp_int;
return ret;
}
diff --git a/src/index.c b/src/index.c
index e6a181979..f6f282d32 100644
--- a/src/index.c
+++ b/src/index.c
@@ -543,7 +543,7 @@ static int read_tree_internal(git_index_tree **out,
{
git_index_tree *tree;
const char *name_start, *buffer;
- long count;
+ int count;
int error = GIT_SUCCESS;
if ((tree = git__malloc(sizeof(git_index_tree))) == NULL)
@@ -685,7 +685,7 @@ static int read_unmerged(git_index *index, const char *buffer, size_t size)
buffer += len;
for (i = 0; i < 3; i++) {
- long tmp;
+ int tmp;
if (git__strtol32(&tmp, buffer, &endptr, 8) < GIT_SUCCESS ||
!endptr || endptr == buffer || *endptr || (unsigned)tmp > UINT_MAX)
diff --git a/src/pkt.c b/src/pkt.c
index a167866bd..9b5a777b5 100644
--- a/src/pkt.c
+++ b/src/pkt.c
@@ -155,7 +155,7 @@ static ssize_t parse_len(const char *line)
{
char num[PKT_LEN_SIZE + 1];
int i, error;
- long len;
+ int len;
const char *num_end;
memcpy(num, line, PKT_LEN_SIZE);
diff --git a/src/revwalk.c b/src/revwalk.c
index 72eb69aba..2d70d40e9 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -172,7 +172,7 @@ static int commit_quick_parse(git_revwalk *walk, commit_object *commit, git_rawo
unsigned char *parents_start;
int i, parents = 0;
- long commit_time;
+ int commit_time;
buffer += strlen("tree ") + GIT_OID_HEXSZ + 1;
diff --git a/src/signature.c b/src/signature.c
index 7cc3733bc..ebb56d7ab 100644
--- a/src/signature.c
+++ b/src/signature.c
@@ -156,7 +156,7 @@ int git_signature_now(git_signature **sig_out, const char *name, const char *ema
static int parse_timezone_offset(const char *buffer, int *offset_out)
{
- long dec_offset;
+ int dec_offset;
int mins, hours, offset;
const char *offset_start;
@@ -236,7 +236,7 @@ static const char *scan_for_previous_token(const char *buffer, const char *left_
static int parse_time(git_time_t *time_out, const char *buffer)
{
- long time;
+ int time;
int error;
if (*buffer == '+' || *buffer == '-')
diff --git a/src/tree.c b/src/tree.c
index ce399a66a..2f9ae2ef1 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -157,7 +157,7 @@ static int tree_parse_buffer(git_tree *tree, const char *buffer, const char *buf
while (buffer < buffer_end) {
git_tree_entry *entry;
- long tmp;
+ int tmp;
entry = git__calloc(1, sizeof(git_tree_entry));
if (entry == NULL) {
diff --git a/src/util.c b/src/util.c
index b46a2a15c..dc0eab38d 100644
--- a/src/util.c
+++ b/src/util.c
@@ -46,10 +46,10 @@ int git__fnmatch(const char *pattern, const char *name, int flags)
}
}
-int git__strtol32(long *result, const char *nptr, const char **endptr, int base)
+int git__strtol64(long long *result, const char *nptr, const char **endptr, int base)
{
const char *p;
- long n, nn;
+ long long n, nn;
int c, ovfl, v, neg, ndig;
p = nptr;
@@ -124,6 +124,23 @@ Return:
return GIT_SUCCESS;
}
+int git__strtol32(int *result, const char *nptr, const char **endptr, int base)
+{
+ int tmp_int, error = GIT_SUCCESS;
+ long long tmp_long;
+
+ if ((error = git__strtol64(&tmp_long, nptr, endptr, base)) < GIT_SUCCESS)
+ return error;
+
+ tmp_int = tmp_long & 0xFFFFFFFF;
+ if (tmp_int != tmp_long)
+ return git__throw(GIT_EOVERFLOW, "Failed to convert. '%s' is too large", nptr);
+
+ *result = tmp_int;
+
+ return error;
+}
+
void git__strntolower(char *str, size_t len)
{
size_t i;
diff --git a/src/util.h b/src/util.h
index f24afb3ad..888caf106 100644
--- a/src/util.h
+++ b/src/util.h
@@ -75,7 +75,8 @@ GIT_INLINE(void *) git__realloc(void *ptr, size_t size)
extern int git__prefixcmp(const char *str, const char *prefix);
extern int git__suffixcmp(const char *str, const char *suffix);
-extern int git__strtol32(long *n, const char *buff, const char **end_buf, int base);
+extern int git__strtol32(int *n, const char *buff, const char **end_buf, int base);
+extern int git__strtol64(long long *n, const char *buff, const char **end_buf, int base);
extern void git__hexdump(const char *buffer, size_t n);
extern uint32_t git__hash(const void *key, int len, uint32_t seed);