diff options
author | 2006-05-27 18:00:27 +0000 | |
---|---|---|
committer | 2006-05-27 18:00:27 +0000 | |
commit | 34b2b92d8dd7d4e9a7386a2aa92c088837cbfbd5 (patch) | |
tree | be78459df8c61a1bcb8f8b166f9bb22716d2bf5a | |
parent | dont forget to expand any keywords before diffing stuff, (diff) | |
download | wireguard-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.c | 13 |
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); } |