Merge pull request #1058 from pwkelley/development Fixes for two segfaults
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
diff --git a/src/cache.c b/src/cache.c
index 1f5b887..edd3a47 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -41,6 +41,7 @@ void git_cache_free(git_cache *cache)
git_cached_obj_decref(cache->nodes[i], cache->free_obj);
}
+ git_mutex_free(&cache->lock);
git__free(cache->nodes);
}
diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c
index 44617f3..df6cd87 100644
--- a/src/transports/winhttp.c
+++ b/src/transports/winhttp.c
@@ -278,6 +278,7 @@ static int winhttp_stream_read(
{
winhttp_stream *s = (winhttp_stream *)stream;
winhttp_subtransport *t = OWNING_SUBTRANSPORT(s);
+ DWORD dw_bytes_read;
replay:
/* Connect if necessary */
@@ -376,12 +377,14 @@ replay:
if (!WinHttpReadData(s->request,
(LPVOID)buffer,
buf_size,
- (LPDWORD)bytes_read))
+ &dw_bytes_read))
{
giterr_set(GITERR_OS, "Failed to read data");
return -1;
}
+ *bytes_read = dw_bytes_read;
+
return 0;
}
diff --git a/src/util.h b/src/util.h
index 4f83d3b..3d00e9c 100644
--- a/src/util.h
+++ b/src/util.h
@@ -42,12 +42,11 @@ GIT_INLINE(char *) git__strdup(const char *str)
GIT_INLINE(char *) git__strndup(const char *str, size_t n)
{
- size_t length;
+ size_t length = 0;
char *ptr;
- length = strlen(str);
- if (n < length)
- length = n;
+ while (length < n && str[length])
+ ++length;
ptr = (char*)malloc(length + 1);
if (!ptr) {
@@ -55,7 +54,9 @@ GIT_INLINE(char *) git__strndup(const char *str, size_t n)
return NULL;
}
- memcpy(ptr, str, length);
+ if (length)
+ memcpy(ptr, str, length);
+
ptr[length] = '\0';
return ptr;