diff --git a/src/netops.c b/src/netops.c index fd788bc1d..cc94d0350 100644 --- a/src/netops.c +++ b/src/netops.c @@ -606,26 +606,26 @@ int gitno_extract_url_parts( start = url; if (at && at < slash) { start = at+1; - *username = git__strndup(url, at - url); + *username = git__substrdup(url, at - url); } if (colon && colon < at) { git__free(*username); - *username = git__strndup(url, colon-url); - *password = git__strndup(colon+1, at-colon-1); + *username = git__substrdup(url, colon-url); + *password = git__substrdup(colon+1, at-colon-1); colon = strchr(at, ':'); } if (colon == NULL) { *port = git__strdup(default_port); } else { - *port = git__strndup(colon + 1, slash - colon - 1); + *port = git__substrdup(colon + 1, slash - colon - 1); } GITERR_CHECK_ALLOC(*port); end = colon == NULL ? slash : colon; - *host = git__strndup(start, end - start); + *host = git__substrdup(start, end - start); GITERR_CHECK_ALLOC(*host); return 0; diff --git a/src/util.h b/src/util.h index e75d777a8..e9edd84a3 100644 --- a/src/util.h +++ b/src/util.h @@ -51,11 +51,7 @@ GIT_INLINE(char *) git__strndup(const char *str, size_t n) while (length < n && str[length]) ++length; - ptr = (char*)malloc(length + 1); - if (!ptr) { - giterr_set_oom(); - return NULL; - } + ptr = (char*)git__malloc(length + 1); if (length) memcpy(ptr, str, length); @@ -65,6 +61,14 @@ GIT_INLINE(char *) git__strndup(const char *str, size_t n) return ptr; } +/* NOTE: This doesn't do null or '\0' checking. Watch those boundaries! */ +GIT_INLINE(char *) git__substrdup(const char *start, size_t n) +{ + char *ptr = (char*)git__calloc(n+1, sizeof(char)); + memcpy(ptr, start, n); + return ptr; +} + GIT_INLINE(void *) git__realloc(void *ptr, size_t size) { void *new_ptr = realloc(ptr, size);