diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7b2f2c5af..2d682a9ac 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2014-09-05 Corinna Vinschen + + * exception.h (class exception): Remove unnecessary #ifdef. + * uinfo.cc (client_request_pwdgrp::client_request_pwdgrp): Fix length + counter to include trailing NUL. + + * sec_auth.cc (get_user_groups): Add experimental exception handler. + (get_user_local_groups): Ditto. + 2014-09-05 Corinna Vinschen * uinfo.cc (pwdgrp::fetch_account_from_windows): Handle APPLICATION diff --git a/winsup/cygwin/exception.h b/winsup/cygwin/exception.h index 9e34799fe..3686bb0b2 100644 --- a/winsup/cygwin/exception.h +++ b/winsup/cygwin/exception.h @@ -126,17 +126,15 @@ public: ~exception () __attribute__ ((always_inline)) { _except_list = save; } }; -#else +#else /* __x86_64__ */ #define exception_list void typedef struct _DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT; class exception { -#ifdef __x86_64__ static EXCEPTION_DISPOSITION myfault (EXCEPTION_RECORD *, exception_list *, CONTEXT *, PDISPATCHER_CONTEXT); -#endif static EXCEPTION_DISPOSITION handle (EXCEPTION_RECORD *, exception_list *, CONTEXT *, PDISPATCHER_CONTEXT); public: @@ -162,7 +160,7 @@ public: } }; -#endif /* !__x86_64 */ +#endif /* !__x86_64__ */ class cygwin_exception { diff --git a/winsup/cygwin/sec_auth.cc b/winsup/cygwin/sec_auth.cc index 3615588ef..eda0f826d 100644 --- a/winsup/cygwin/sec_auth.cc +++ b/winsup/cygwin/sec_auth.cc @@ -20,6 +20,7 @@ details. */ #include "fhandler.h" #include "dtable.h" #include "cygheap.h" +#include "exception.h" #include "ntdll.h" #include "tls_pbuf.h" #include @@ -255,9 +256,13 @@ get_user_groups (WCHAR *logonserver, cygsidlist &grp_list, DWORD cnt, tot, len; NET_API_STATUS ret; - /* Look only on logonserver */ - ret = NetUserGetGroups (logonserver, user, 0, (LPBYTE *) &buf, - MAX_PREFERRED_LENGTH, &cnt, &tot); + { + /* Experimental SEH */ + exception protect; + /* Look only on logonserver */ + ret = NetUserGetGroups (logonserver, user, 0, (LPBYTE *) &buf, + MAX_PREFERRED_LENGTH, &cnt, &tot); + } if (ret) { __seterrno_from_win_error (ret); @@ -306,9 +311,14 @@ get_user_local_groups (PWCHAR logonserver, PWCHAR domain, DWORD cnt, tot; NET_API_STATUS ret; - ret = NetUserGetLocalGroups (logonserver, user, 0, LG_INCLUDE_INDIRECT, - (LPBYTE *) &buf, MAX_PREFERRED_LENGTH, - &cnt, &tot); + { + /* Experimental SEH */ + exception protect; + + ret = NetUserGetLocalGroups (logonserver, user, 0, LG_INCLUDE_INDIRECT, + (LPBYTE *) &buf, MAX_PREFERRED_LENGTH, + &cnt, &tot); + } if (ret) { __seterrno_from_win_error (ret); diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc index 9d6c7df7c..12d5069d1 100644 --- a/winsup/cygwin/uinfo.cc +++ b/winsup/cygwin/uinfo.cc @@ -1968,7 +1968,7 @@ client_request_pwdgrp::client_request_pwdgrp (fetch_user_arg_t &arg, bool group) break; case NAME_arg: p = stpcpy (_parameters.in.arg.name, arg.name); - len = p - _parameters.in.arg.name; + len = p - _parameters.in.arg.name + 1; break; case ID_arg: _parameters.in.arg.id = arg.id;