diff options
author | Russell Belfer <rb@github.com> | 2013-02-15 16:01:31 -0800 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2013-02-15 16:01:31 -0800 |
commit | 71d62d3905723c0263ca00a1d68825e2c35fb987 (patch) | |
tree | 8506ebad82ae01d09022893273eb48d61f5ae662 | |
parent | a7ed746093f42fd61f38a0a9ea5ef73c45f11efa (diff) | |
download | libgit2-71d62d3905723c0263ca00a1d68825e2c35fb987.tar.gz |
Fix memory leak in p_getaddrinfo on Amiga
If gethostbyname() fails on platforms with NO_ADDRINFO, the code
leaks the struct addrinfo that was allocated. This fixes that
(and a number of code formatting issues in that area of code in
src/posix.c).
-rw-r--r-- | src/posix.c | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/src/posix.c b/src/posix.c index 95cd28edc..5d526d33c 100644 --- a/src/posix.c +++ b/src/posix.c @@ -13,25 +13,28 @@ #ifndef GIT_WIN32 #ifdef NO_ADDRINFO + int p_getaddrinfo( const char *host, const char *port, struct addrinfo *hints, struct addrinfo **info) { - GIT_UNUSED(hints); - struct addrinfo *ainfo, *ai; int p = 0; - + + GIT_UNUSED(hints); + if ((ainfo = malloc(sizeof(struct addrinfo))) == NULL) return -1; - - if ((ainfo->ai_hostent = gethostbyname(host)) == NULL) + + if ((ainfo->ai_hostent = gethostbyname(host)) == NULL) { + free(ainfo); return -2; - + } + ainfo->ai_servent = getservbyname(port, 0); - + if (ainfo->ai_servent) ainfo->ai_port = ainfo->ai_servent->s_port; else @@ -50,14 +53,14 @@ int p_getaddrinfo( ainfo->ai_addrlen = sizeof(struct sockaddr_in); *info = ainfo; - + if (ainfo->ai_hostent->h_addr_list[1] == NULL) { ainfo->ai_next = NULL; return 0; } - + ai = ainfo; - + for (p = 1; ainfo->ai_hostent->h_addr_list[p] != NULL; p++) { ai->ai_next = malloc(sizeof(struct addrinfo)); memcpy(&ai->ai_next, ainfo, sizeof(struct addrinfo)); @@ -67,7 +70,7 @@ int p_getaddrinfo( ai->ai_next->ai_addr = (struct addrinfo *)&ai->ai_next->ai_addr_in; ai = ai->ai_next; } - + ai->ai_next = NULL; return 0; } @@ -75,9 +78,9 @@ int p_getaddrinfo( void p_freeaddrinfo(struct addrinfo *info) { struct addrinfo *p, *next; - + p = info; - + while(p != NULL) { next = p->ai_next; free(p); @@ -88,27 +91,19 @@ void p_freeaddrinfo(struct addrinfo *info) const char *p_gai_strerror(int ret) { switch(ret) { - case -1: - return "Out of memory"; - break; - - case -2: - return "Address lookup failed"; - break; - - default: - return "Unknown error"; - break; + case -1: return "Out of memory"; break; + case -2: return "Address lookup failed"; break; + default: return "Unknown error"; break; } } + #endif /* NO_ADDRINFO */ int p_open(const char *path, int flags, ...) { mode_t mode = 0; - if (flags & O_CREAT) - { + if (flags & O_CREAT) { va_list arg_list; va_start(arg_list, flags); @@ -159,6 +154,7 @@ int p_rename(const char *from, const char *to) int p_read(git_file fd, void *buf, size_t cnt) { char *b = buf; + while (cnt) { ssize_t r; #ifdef GIT_WIN32 @@ -183,6 +179,7 @@ int p_read(git_file fd, void *buf, size_t cnt) int p_write(git_file fd, const void *buf, size_t cnt) { const char *b = buf; + while (cnt) { ssize_t r; #ifdef GIT_WIN32 |