Author: vlendec Date: 2007-10-03 18:37:57 +0000 (Wed, 03 Oct 2007) New Revision: 25484
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25484 Log: Fix srvsrc_NetFileEnum listing only for one user Modified: branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c Changeset: Modified: branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c =================================================================== --- branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c 2007-10-03 13:34:44 UTC (rev 25483) +++ branches/SAMBA_3_2/source/rpc_server/srv_srvsvc_nt.c 2007-10-03 18:37:57 UTC (rev 25484) @@ -37,6 +37,7 @@ struct file_enum_count { TALLOC_CTX *ctx; + const char *username; uint32 count; struct srvsvc_NetFileInfo3 *info; }; @@ -55,56 +56,64 @@ { struct pipe_open_rec prec; struct file_enum_count *fenum = (struct file_enum_count *)p; + struct srvsvc_NetFileInfo3 *f; + int i = fenum->count; + pstring fullpath; + const char *username; if (rec->value.dsize != sizeof(struct pipe_open_rec)) return 0; memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec)); - if ( process_exists(prec.pid) ) { - struct srvsvc_NetFileInfo3 *f; - int i = fenum->count; - pstring fullpath; + if ( !process_exists(prec.pid) ) { + return 0; + } + + username = uidtoname(prec.uid); + + if ((fenum->username != NULL) + && !strequal(username, fenum->username)) { + return 0; + } - snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); + snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct srvsvc_NetFileInfo3, i+1 ); - if ( !f ) { - DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); - return 1; - } + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, + struct srvsvc_NetFileInfo3, i+1 ); + if ( !f ) { + DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); + return 1; + } - fenum->info = f; + fenum->info = f; - fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum); - fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA); - fenum->info[i].num_locks = 0; - if (!(fenum->info[i].user = talloc_strdup( - fenum->ctx, uidtoname(prec.uid)))) { - /* There's not much we can do here. */ - fenum->info[i].user = ""; - } - if (!(fenum->info[i].path = talloc_strdup( - fenum->ctx, fullpath))) { - /* There's not much we can do here. */ - fenum->info[i].path = ""; - } - - fenum->count++; + fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum); + fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA); + fenum->info[i].num_locks = 0; + fenum->info[i].user = talloc_move(fenum->ctx, &username); + if (!(fenum->info[i].path = talloc_strdup( + fenum->ctx, fullpath))) { + /* There's not much we can do here. */ + fenum->info[i].path = ""; } + fenum->count++; + return 0; } /******************************************************************* ********************************************************************/ -static WERROR net_enum_pipes( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info, +static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, + struct srvsvc_NetFileInfo3 **info, uint32 *count, uint32 *resume ) { struct file_enum_count fenum; fenum.ctx = ctx; + fenum.username = username; fenum.info = *info; fenum.count = *count; @@ -137,12 +146,20 @@ int num_locks = 0; pstring fullpath; uint32 permissions; + const char *username; /* If the pid was not found delete the entry from connections.tdb */ if (!process_exists(e->pid)) { return; } + + username = uidtoname(e->uid); + + if ((fenum->username != NULL) + && !strequal(username, fenum->username)) { + return; + } f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct srvsvc_NetFileInfo3, i+1 ); @@ -175,11 +192,7 @@ fenum->info[i].fid = e->share_file_id; fenum->info[i].permissions = permissions; fenum->info[i].num_locks = num_locks; - if (!(fenum->info[i].user = talloc_strdup( - fenum->ctx, uidtoname(e->uid)))) { - /* There's not much we can do here. */ - fenum->info[i].user = ""; - } + fenum->info[i].user = talloc_move(fenum->ctx, &username); if (!(fenum->info[i].path = talloc_strdup( fenum->ctx, fullpath))) { /* There's not much we can do here. */ @@ -192,12 +205,14 @@ /******************************************************************* ********************************************************************/ -static WERROR net_enum_files( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info, +static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, + struct srvsvc_NetFileInfo3 **info, uint32 *count, uint32 *resume ) { struct file_enum_count f_enum_cnt; f_enum_cnt.ctx = ctx; + f_enum_cnt.username = username; f_enum_cnt.count = *count; f_enum_cnt.info = *info; @@ -1047,7 +1062,9 @@ makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uint32 *resume_hnd, uint32 *num_entries ) +static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, + uint32 *resume_hnd, const char *username, + uint32 *num_entries ) { WERROR status; @@ -1057,11 +1074,13 @@ ctr->ctr3 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetFileCtr3); - status = net_enum_files(p->mem_ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + status = net_enum_files(p->mem_ctx, username, &ctr->ctr3->array, + num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(status)) return status; - status = net_enum_pipes(p->mem_ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + status = net_enum_pipes(p->mem_ctx, username, &ctr->ctr3->array, + num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(status)) return status; @@ -1077,7 +1096,8 @@ { switch ( *r->in.level ) { case 3: - return net_file_enum_3(p, r->in.ctr, r->in.resume_handle, r->out.totalentries ); + return net_file_enum_3(p, r->in.ctr, r->in.resume_handle, + r->in.user, r->out.totalentries ); default: return WERR_UNKNOWN_LEVEL; } Modified: branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c =================================================================== --- branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c 2007-10-03 13:34:44 UTC (rev 25483) +++ branches/SAMBA_3_2_0/source/rpc_server/srv_srvsvc_nt.c 2007-10-03 18:37:57 UTC (rev 25484) @@ -33,6 +33,7 @@ struct file_enum_count { TALLOC_CTX *ctx; + const char *username; int count; FILE_INFO_3 *info; }; @@ -51,36 +52,43 @@ { struct pipe_open_rec prec; struct file_enum_count *fenum = (struct file_enum_count *)p; + FILE_INFO_3 *f; + int i = fenum->count; + pstring fullpath; + const char *username; if (rec->value.dsize != sizeof(struct pipe_open_rec)) return 0; memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec)); - if ( process_exists(prec.pid) ) { - FILE_INFO_3 *f; - int i = fenum->count; - pstring fullpath; + if ( !process_exists(prec.pid) ) { + return 0; + } + + username = uidtoname(prec.uid); + + if ((fenum->username != NULL) + && !strequal(username, fenum->username)) { + return 0; + } - snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); + snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); - if ( !f ) { - DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); - return 1; - } - fenum->info = f; + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); + if ( !f ) { + DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); + return 1; + } + fenum->info = f; - - init_srv_file_info3( &fenum->info[i], - (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum), - (FILE_READ_DATA|FILE_WRITE_DATA), - 0, - uidtoname( prec.uid ), - fullpath ); + init_srv_file_info3( + &fenum->info[i], + (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum), + (FILE_READ_DATA|FILE_WRITE_DATA), + 0, username, fullpath); - fenum->count++; - } + fenum->count++; return 0; } @@ -88,12 +96,14 @@ /******************************************************************* ********************************************************************/ -static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info, +static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, + FILE_INFO_3 **info, uint32 *count, uint32 resume ) { struct file_enum_count fenum; fenum.ctx = ctx; + fenum.username = username; fenum.count = *count; fenum.info = *info; @@ -126,12 +136,20 @@ int num_locks = 0; pstring fullpath; uint32 permissions; + const char *username; /* If the pid was not found delete the entry from connections.tdb */ if ( !process_exists(e->pid) ) { return; } + + username = uidtoname(e->uid); + + if ((fenum->username != NULL) + && !strequal(username, fenum->username)) { + return; + } f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); if ( !f ) { @@ -165,7 +183,7 @@ e->share_file_id, permissions, num_locks, - uidtoname(e->uid), + username, fullpath ); fenum->count++; @@ -174,12 +192,14 @@ /******************************************************************* ********************************************************************/ -static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info, +static WERROR net_enum_files( TALLOC_CTX *ctx, const char **username, + FILE_INFO_3 **info, uint32 *count, uint32 resume ) { struct file_enum_count f_enum_cnt; f_enum_cnt.ctx = ctx; + f_enum_cnt.username = username; f_enum_cnt.count = *count; f_enum_cnt.info = *info; @@ -1112,7 +1132,8 @@ makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static WERROR net_file_enum_3( SRV_R_NET_FILE_ENUM *r, uint32 resume_hnd ) +static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r, + uint32 resume_hnd ) { TALLOC_CTX *ctx = talloc_tos(); SRV_FILE_INFO_CTR *ctr = &r->ctr; @@ -1121,11 +1142,13 @@ (b) active pipes (c) open directories and files */ - r->status = net_enum_files( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd ); + r->status = net_enum_files( ctx, username, &ctr->file.info3, + &ctr->num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(r->status)) goto done; - r->status = net_enum_pipes( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd ); + r->status = net_enum_pipes( ctx, username, &ctr->file.info3, + &ctr->num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(r->status)) goto done; @@ -1153,7 +1176,8 @@ { switch ( q_u->level ) { case 3: - return net_file_enum_3( r_u, get_enum_hnd(&q_u->enum_hnd) ); + return net_file_enum_3( q_u->username, r_u, + get_enum_hnd(&q_u->enum_hnd) ); default: return WERR_UNKNOWN_LEVEL; }
