summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpedro <pedro@openbsd.org>2006-05-27 18:00:27 +0000
committerpedro <pedro@openbsd.org>2006-05-27 18:00:27 +0000
commit34b2b92d8dd7d4e9a7386a2aa92c088837cbfbd5 (patch)
treebe78459df8c61a1bcb8f8b166f9bb22716d2bf5a
parentdont forget to expand any keywords before diffing stuff, (diff)
downloadwireguard-openbsd-34b2b92d8dd7d4e9a7386a2aa92c088837cbfbd5.tar.xz
wireguard-openbsd-34b2b92d8dd7d4e9a7386a2aa92c088837cbfbd5.zip
Don't leak memory if getcwd() was passed NULL and __getcwd() fails
Okay miod@ sturm@ deraadt@
-rw-r--r--lib/libc/gen/getcwd.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/libc/gen/getcwd.c b/lib/libc/gen/getcwd.c
index 7cbe3851c07..6b4efeacc0c 100644
--- a/lib/libc/gen/getcwd.c
+++ b/lib/libc/gen/getcwd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getcwd.c,v 1.15 2006/05/27 16:14:02 pedro Exp $ */
+/* $OpenBSD: getcwd.c,v 1.16 2006/05/27 18:00:27 pedro Exp $ */
/*
* Copyright (c) 2005 Marius Eriksen <marius@openbsd.org>
@@ -25,14 +25,21 @@ int __getcwd(char *buf, size_t len);
char *
getcwd(char *buf, size_t size)
{
+ char *allocated = NULL;
+
if (buf != NULL && size == 0) {
errno = EINVAL;
return (NULL);
}
if (buf == NULL &&
- (buf = malloc(size = MAXPATHLEN)) == NULL)
+ (allocated = buf = malloc(size = MAXPATHLEN)) == NULL)
+ return (NULL);
+
+ if (__getcwd(buf, size) < 0) {
+ free(allocated);
return (NULL);
+ }
- return (__getcwd(buf, size) < 0 ? NULL : buf);
+ return (buf);
}