s3: rpc_server/srvsvc: Ensure we don't continually realloc inside init_srv_sess_info_1().
authorJeremy Allison <jra@samba.org>
Thu, 16 Jan 2014 18:43:30 +0000 (10:43 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 17 Jan 2014 22:12:48 +0000 (14:12 -0800)
Just allocate the return value directly. Makes iteration of open files much easier.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/rpc_server/srvsvc/srv_srvsvc_nt.c

index 67078059e60c19cbb23207444d081f4d28b51249..bb106caa532baf4eba3aeebfc637f3364bd5ee62 100644 (file)
@@ -862,7 +862,25 @@ static WERROR init_srv_sess_info_1(struct pipes_struct *p,
 
        *total_entries = list_sessions(p->mem_ctx, &session_list);
 
-       for (; resume_handle < *total_entries; resume_handle++) {
+       if (resume_handle >= *total_entries) {
+               if (resume_handle_p) {
+                       *resume_handle_p = 0;
+               }
+               return WERR_OK;
+       }
+
+       /* We know num_entries must be positive, due to
+          the check resume_handle >= *total_entries above. */
+
+       num_entries = *total_entries - resume_handle;
+
+       ctr1->array = talloc_zero_array(p->mem_ctx,
+                                  struct srvsvc_NetSessInfo1,
+                                  num_entries);
+
+       W_ERROR_HAVE_NO_MEMORY(ctr1->array);
+
+       for (num_entries = 0; resume_handle < *total_entries; num_entries++, resume_handle++) {
                uint32 num_files;
                uint32 connect_time;
                struct passwd *pw = getpwnam(session_list[resume_handle].username);
@@ -871,27 +889,20 @@ static WERROR init_srv_sess_info_1(struct pipes_struct *p,
                if ( !pw ) {
                        DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
                                session_list[resume_handle].username));
-                       continue;
+                       num_files = 0;
+               } else {
+                       num_files = net_count_files(pw->pw_uid, session_list[resume_handle].pid);
                }
 
                connect_time = (uint32_t)(now - session_list[resume_handle].connect_start);
-               num_files = net_count_files(pw->pw_uid, session_list[resume_handle].pid);
                guest = strequal( session_list[resume_handle].username, lp_guestaccount() );
 
-               ctr1->array = talloc_realloc(p->mem_ctx,
-                                                  ctr1->array,
-                                                  struct srvsvc_NetSessInfo1,
-                                                  num_entries+1);
-               W_ERROR_HAVE_NO_MEMORY(ctr1->array);
-
                ctr1->array[num_entries].client         = session_list[resume_handle].remote_machine;
                ctr1->array[num_entries].user           = session_list[resume_handle].username;
                ctr1->array[num_entries].num_open       = num_files;
                ctr1->array[num_entries].time           = connect_time;
                ctr1->array[num_entries].idle_time      = 0;
                ctr1->array[num_entries].user_flags     = guest;
-
-               num_entries++;
        }
 
        ctr1->count = num_entries;