Commit 8a328cf442237f65d58ad779d775c77a7c462df5

Vicent Martí 2012-11-09T13:19:32

Merge pull request #1058 from pwkelley/development Fixes for two segfaults

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;