The Samba-Bugzilla – Attachment 4555 Details for
Bug 6592
Samba server does not respond properly to NetWkstaGetInfo and NetWkstaUserEnum requests
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Updated patch
smb.patch (text/plain), 8.09 KB, created by
Ian Puleston
on 2009-08-13 11:32:23 UTC
(
hide
)
Description:
Updated patch
Filename:
MIME Type:
Creator:
Ian Puleston
Created:
2009-08-13 11:32:23 UTC
Size:
8.09 KB
patch
obsolete
>From 6ca83b9d015479ccddc45598974da2045bea3033 Mon Sep 17 00:00:00 2001 >From: Volker Lendecke <vl@samba.org> >Date: Mon, 3 Aug 2009 16:52:01 +0200 >Subject: [PATCH] Support NetWkstaGetInfo 101 and 102 > >--- > source3/configure.in | 2 +- > source3/rpc_server/srv_wkssvc_nt.c | 128 +++++++++++++++++++++++++++++++---- > 2 files changed, 114 insertions(+), 16 deletions(-) > >diff --git a/source3/configure.in b/source3/configure.in >index 7cfd3fb..068f9cd 100644 >--- a/source3/configure.in >+++ b/source3/configure.in >@@ -2016,7 +2016,7 @@ dnl We need to check for many of them > dnl But we don't need to do each and every one, because our code uses > dnl mostly just the utmp (not utmpx) fields. > >-AC_CHECK_FUNCS(pututline pututxline updwtmp updwtmpx getutmpx) >+AC_CHECK_FUNCS(pututline pututxline updwtmp updwtmpx getutmpx getutxent) > > AC_CACHE_CHECK([for ut_name in utmp],samba_cv_HAVE_UT_UT_NAME,[ > AC_TRY_COMPILE([#include <sys/types.h> >diff --git a/source3/rpc_server/srv_wkssvc_nt.c b/source3/rpc_server/srv_wkssvc_nt.c >index b06818e..0f889db 100644 >--- a/source3/rpc_server/srv_wkssvc_nt.c >+++ b/source3/rpc_server/srv_wkssvc_nt.c >@@ -29,12 +29,54 @@ > #undef DBGC_CLASS > #define DBGC_CLASS DBGC_RPC_SRV > >+#ifdef HAVE_GETUTXENT >+ >+#include <utmpx.h> >+ >+static char **get_logged_on_userlist(TALLOC_CTX *mem_ctx) >+{ >+ char **users = NULL; >+ int num_users = 0; >+ struct utmpx *u; >+ >+ while ((u = getutxent()) != NULL) { >+ char **tmp; >+ tmp = talloc_realloc(mem_ctx, users, char *, num_users+1); >+ if (tmp == NULL) { >+ return NULL; >+ } >+ users = tmp; >+ users[num_users] = talloc_strdup(users, u->ut_user); >+ if (users[num_users] == NULL) { >+ TALLOC_FREE(users); >+ return NULL; >+ } >+ } >+ return users; >+} >+ >+#else >+ >+static char **get_logged_on_userlist(TALLOC_CTX *mem_ctx) >+{ >+ return NULL; >+} >+ >+#endif >+ > /******************************************************************* > Fill in the values for the struct wkssvc_NetWkstaInfo100. > ********************************************************************/ > >-static void create_wks_info_100(struct wkssvc_NetWkstaInfo100 *info100) >+static struct wkssvc_NetWkstaInfo100 *create_wks_info_100(TALLOC_CTX *mem_ctx) > { >+ struct wkssvc_NetWkstaInfo100 *info100; >+ >+ info100 = talloc(mem_ctx, struct wkssvc_NetWkstaInfo100); >+ if (info100 == NULL) { >+ return NULL; >+ } >+ > info100->platform_id = PLATFORM_ID_NT; /* unknown */ > info100->version_major = lp_major_announce_version(); > info100->version_minor = lp_minor_announce_version(); >@@ -44,7 +86,56 @@ static void create_wks_info_100(struct wkssvc_NetWkstaInfo100 *info100) > info100->domain_name = talloc_asprintf_strupper_m( > info100, "%s", lp_workgroup()); > >- return; >+ return info100; >+} >+ >+static struct wkssvc_NetWkstaInfo101 *create_wks_info_101(TALLOC_CTX *mem_ctx) >+{ >+ struct wkssvc_NetWkstaInfo101 *info101; >+ >+ info101 = talloc(mem_ctx, struct wkssvc_NetWkstaInfo101); >+ if (info101 == NULL) { >+ return NULL; >+ } >+ >+ info101->platform_id = PLATFORM_ID_NT; /* unknown */ >+ info101->version_major = lp_major_announce_version(); >+ info101->version_minor = lp_minor_announce_version(); >+ >+ info101->server_name = talloc_asprintf_strupper_m( >+ info101, "%s", global_myname()); >+ info101->domain_name = talloc_asprintf_strupper_m( >+ info101, "%s", lp_workgroup()); >+ info101->lan_root = NULL; >+ >+ return info101; >+} >+ >+static struct wkssvc_NetWkstaInfo102 *create_wks_info_102(TALLOC_CTX *mem_ctx) >+{ >+ struct wkssvc_NetWkstaInfo102 *info102; >+ char **users; >+ >+ info102 = talloc(mem_ctx, struct wkssvc_NetWkstaInfo102); >+ if (info102 == NULL) { >+ return NULL; >+ } >+ >+ info102->platform_id = PLATFORM_ID_NT; /* unknown */ >+ info102->version_major = lp_major_announce_version(); >+ info102->version_minor = lp_minor_announce_version(); >+ >+ info102->server_name = talloc_asprintf_strupper_m( >+ info102, "%s", global_myname()); >+ info102->domain_name = talloc_asprintf_strupper_m( >+ info102, "%s", lp_workgroup()); >+ info102->lan_root = NULL; >+ >+ users = get_logged_on_userlist(talloc_tos()); >+ info102->logged_on_users = talloc_array_length(users); >+ TALLOC_FREE(users); >+ >+ return info102; > } > > /******************************************************************** >@@ -53,22 +144,29 @@ static void create_wks_info_100(struct wkssvc_NetWkstaInfo100 *info100) > > WERROR _wkssvc_NetWkstaGetInfo(pipes_struct *p, struct wkssvc_NetWkstaGetInfo *r) > { >- struct wkssvc_NetWkstaInfo100 *wks100 = NULL; >- >- /* We only support info level 100 currently */ >- >- if ( r->in.level != 100 ) { >+ switch (r->in.level) { >+ case 100: >+ r->out.info->info100 = create_wks_info_100(p->mem_ctx); >+ if (r->out.info->info100 == NULL) { >+ return WERR_NOMEM; >+ } >+ break; >+ case 101: >+ r->out.info->info101 = create_wks_info_101(p->mem_ctx); >+ if (r->out.info->info101 == NULL) { >+ return WERR_NOMEM; >+ } >+ break; >+ case 102: >+ r->out.info->info102 = create_wks_info_102(p->mem_ctx); >+ if (r->out.info->info102 == NULL) { >+ return WERR_NOMEM; >+ } >+ break; >+ default: > return WERR_UNKNOWN_LEVEL; > } > >- if ( (wks100 = TALLOC_ZERO_P(p->mem_ctx, struct wkssvc_NetWkstaInfo100)) == NULL ) { >- return WERR_NOMEM; >- } >- >- create_wks_info_100( wks100 ); >- >- r->out.info->info100 = wks100; >- > return WERR_OK; > } > >-- >1.6.0.1 > > >From 51256d7f8fdea4e00c92af268328b5bbf2a965a5 Mon Sep 17 00:00:00 2001 >From: Volker Lendecke <vl@samba.org> >Date: Mon, 3 Aug 2009 17:27:11 +0200 >Subject: [PATCH] First cut at _wkssvc_NetWkstaEnumUsers > >This needs access checks! >--- > source3/rpc_server/srv_wkssvc_nt.c | 55 ++++++++++++++++++++++++++++++++++-- > 1 files changed, 52 insertions(+), 3 deletions(-) > >diff --git a/source3/rpc_server/srv_wkssvc_nt.c b/source3/rpc_server/srv_wkssvc_nt.c >index 0f889db..b1deceb 100644 >--- a/source3/rpc_server/srv_wkssvc_nt.c >+++ b/source3/rpc_server/srv_wkssvc_nt.c >@@ -41,6 +41,9 @@ static char **get_logged_on_userlist(TALLOC_CTX *mem_ctx) > > while ((u = getutxent()) != NULL) { > char **tmp; >+ if (u->ut_type != USER_PROCESS) { >+ continue; >+ } > tmp = talloc_realloc(mem_ctx, users, char *, num_users+1); > if (tmp == NULL) { > return NULL; >@@ -51,6 +54,7 @@ static char **get_logged_on_userlist(TALLOC_CTX *mem_ctx) > TALLOC_FREE(users); > return NULL; > } >+ num_users += 1; > } > return users; > } >@@ -180,14 +184,59 @@ WERROR _wkssvc_NetWkstaSetInfo(pipes_struct *p, struct wkssvc_NetWkstaSetInfo *r > return WERR_NOT_SUPPORTED; > } > >+static struct wkssvc_NetWkstaEnumUsersCtr0 *create_enum_users0( >+ TALLOC_CTX *mem_ctx) >+{ >+ struct wkssvc_NetWkstaEnumUsersCtr0 *ctr0; >+ char **users; >+ int i, num_users; >+ >+ ctr0 = talloc(mem_ctx, struct wkssvc_NetWkstaEnumUsersCtr0); >+ if (ctr0 == NULL) { >+ return NULL; >+ } >+ >+ users = get_logged_on_userlist(talloc_tos()); >+ if (users == NULL) { >+ TALLOC_FREE(ctr0); >+ return NULL; >+ } >+ >+ num_users = talloc_array_length(users); >+ ctr0->entries_read = num_users; >+ ctr0->user0 = talloc_array(ctr0, struct wkssvc_NetrWkstaUserInfo0, >+ num_users); >+ if (ctr0->user0 == NULL) { >+ TALLOC_FREE(ctr0); >+ TALLOC_FREE(users); >+ return NULL; >+ } >+ >+ for (i=0; i<num_users; i++) { >+ ctr0->user0[i].user_name = talloc_move(ctr0->user0, &users[i]); >+ } >+ TALLOC_FREE(users); >+ return ctr0; >+} >+ > /******************************************************************** > ********************************************************************/ > > WERROR _wkssvc_NetWkstaEnumUsers(pipes_struct *p, struct wkssvc_NetWkstaEnumUsers *r) > { >- /* FIXME: Add implementation code here */ >- p->rng_fault_state = True; >- return WERR_NOT_SUPPORTED; >+ if (r->in.info->level != 0) { >+ return WERR_UNKNOWN_LEVEL; >+ } >+ >+ r->out.info->ctr.user0 = create_enum_users0(p->mem_ctx); >+ if (r->out.info->ctr.user0 == NULL) { >+ return WERR_NOMEM; >+ } >+ r->out.info->level = r->in.info->level; >+ *r->out.entries_read = r->out.info->ctr.user0->entries_read; >+ *r->out.resume_handle = 0; >+ >+ return WERR_OK; > } > > /******************************************************************** >-- >1.6.0.1 > >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 6592
:
4486
|
4487
|
4488
|
4489
|
4490
|
4492
|
4496
|
4502
|
4503
|
4524
|
4525
|
4549
|
4555
|
4564
|
4569
|
4906
|
4963
|
4967
|
4989
|
4997
|
5002