* fhandler_procsys.cc (fhandler_procsys::opendir): Avoid SEGV if

opening object directory fails.
	* fhandler_virtual.cc (fhandler_virtual::opendir): Don't leak memory.
This commit is contained in:
Corinna Vinschen 2011-02-15 14:44:11 +00:00
parent c48947b454
commit fe222f2210
3 changed files with 14 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2011-02-15 Corinna Vinschen <corinna@vinschen.de>
* fhandler_procsys.cc (fhandler_procsys::opendir): Avoid SEGV if
opening object directory fails.
* fhandler_virtual.cc (fhandler_virtual::opendir): Don't leak memory.
2011-02-15 Corinna Vinschen <corinna@vinschen.de> 2011-02-15 Corinna Vinschen <corinna@vinschen.de>
* fhandler_disk_file.cc (fhandler_disk_file::readdir_helper): Don't * fhandler_disk_file.cc (fhandler_disk_file::readdir_helper): Don't

View File

@ -1,6 +1,6 @@
/* fhandler_procsys.cc: fhandler for native NT namespace. /* fhandler_procsys.cc: fhandler for native NT namespace.
Copyright 2010 Red Hat, Inc. Copyright 2010, 2011 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -245,18 +245,20 @@ fhandler_procsys::opendir (int fd)
OBJECT_ATTRIBUTES attr; OBJECT_ATTRIBUTES attr;
NTSTATUS status; NTSTATUS status;
HANDLE h; HANDLE h;
DIR *dir = fhandler_virtual::opendir (fd); DIR *dir;
mk_unicode_path (&path); mk_unicode_path (&path);
InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE, NULL, NULL); InitializeObjectAttributes (&attr, &path, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = NtOpenDirectoryObject (&h, DIRECTORY_QUERY, &attr); status = NtOpenDirectoryObject (&h, DIRECTORY_QUERY, &attr);
if (!NT_SUCCESS (status)) if (!NT_SUCCESS (status))
{ {
free (dir);
__seterrno_from_nt_status (status); __seterrno_from_nt_status (status);
return NULL; return NULL;
} }
dir->__handle = h; if (!(dir = fhandler_virtual::opendir (fd)))
NtClose (h);
else
dir->__handle = h;
return dir; return dir;
} }

View File

@ -1,6 +1,6 @@
/* fhandler_virtual.cc: base fhandler class for virtual filesystems /* fhandler_virtual.cc: base fhandler class for virtual filesystems
Copyright 2002, 2003, 2004, 2005, 2007, 2008, 2009 Red Hat, Inc. Copyright 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -59,6 +59,7 @@ fhandler_virtual::opendir (int fd)
else if ((dir->__d_dirent = else if ((dir->__d_dirent =
(struct dirent *) malloc (sizeof (struct dirent))) == NULL) (struct dirent *) malloc (sizeof (struct dirent))) == NULL)
{ {
free (dir->__d_dirname);
free (dir); free (dir);
set_errno (ENOMEM); set_errno (ENOMEM);
} }