commit f270548637fc35b5b9576bd91ac1bdcbffb1f039 from: Christian Weisgerber date: Sun May 30 15:37:51 2021 UTC dial_git(): fix memory leak and simplify Simplify dial_git() by formatting the initial Git protocol packet with dprintf, suggested by millert, and stop leaking an asprintf buffer. ok stsp commit - 57c181985845591d1fcd97be660feb8e256fd4be commit + f270548637fc35b5b9576bd91ac1bdcbffb1f039 blob - b581bbe3e8fc97d4d3215bc948d761fa9c4135e9 blob + 0c3e36643b33aa891a6ae0ca06eac2c739842c4c --- lib/fetch.c +++ lib/fetch.c @@ -156,8 +156,8 @@ dial_git(int *fetchfd, const char *host, const char *p { const struct got_error *err = NULL; struct addrinfo hints, *servinfo, *p; - char *cmd = NULL, *pkt = NULL; - int fd = -1, totlen, r, eaicode; + char *cmd = NULL; + int fd = -1, len, r, eaicode; *fetchfd = -1; @@ -190,31 +190,15 @@ dial_git(int *fetchfd, const char *host, const char *p goto done; if (asprintf(&cmd, "git-%s-pack %s", direction, path) == -1) { - err = got_error_from_errno("asprintf"); - goto done; - } - totlen = 4 + strlen(cmd) + 1 + strlen("host=") + strlen(host) + 1; - if (asprintf(&pkt, "%04x%s", totlen, cmd) == -1) { - err = got_error_from_errno("asprintf"); - goto done; - } - r = write(fd, pkt, strlen(pkt) + 1); - if (r == -1) { - err = got_error_from_errno("write"); - goto done; - } - if (asprintf(&pkt, "host=%s", host) == -1) { err = got_error_from_errno("asprintf"); goto done; } - r = write(fd, pkt, strlen(pkt) + 1); - if (r == -1) { - err = got_error_from_errno("write"); - goto done; - } + len = 4 + strlen(cmd) + 1 + strlen("host=") + strlen(host) + 1; + r = dprintf(fd, "%04x%s%chost=%s%c", len, cmd, '\0', host, '\0'); + if (r < 0) + err = got_error_from_errno("dprintf"); done: free(cmd); - free(pkt); if (err) { if (fd != -1) close(fd);