[BACK]Return to sftp-server.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/sftp-server.c between version 1.142 and 1.143

version 1.142, 2022/09/16 06:55:37 version 1.143, 2022/09/19 10:40:52
Line 30 
Line 30 
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
 #include <pwd.h>  #include <pwd.h>
   #include <grp.h>
 #include <time.h>  #include <time.h>
 #include <unistd.h>  #include <unistd.h>
 #include <stdarg.h>  #include <stdarg.h>
Line 112 
Line 113 
 static void process_extended_expand(u_int32_t id);  static void process_extended_expand(u_int32_t id);
 static void process_extended_copy_data(u_int32_t id);  static void process_extended_copy_data(u_int32_t id);
 static void process_extended_home_directory(u_int32_t id);  static void process_extended_home_directory(u_int32_t id);
   static void process_extended_get_users_groups_by_id(u_int32_t id);
 static void process_extended(u_int32_t id);  static void process_extended(u_int32_t id);
   
 struct sftp_handler {  struct sftp_handler {
Line 160 
Line 162 
         { "copy-data", "copy-data", 0, process_extended_copy_data, 1 },          { "copy-data", "copy-data", 0, process_extended_copy_data, 1 },
         { "home-directory", "home-directory", 0,          { "home-directory", "home-directory", 0,
             process_extended_home_directory, 0 },              process_extended_home_directory, 0 },
           { "users-groups-by-id", "users-groups-by-id@openssh.com", 0,
               process_extended_get_users_groups_by_id, 0 },
         { NULL, NULL, 0, NULL, 0 }          { NULL, NULL, 0, NULL, 0 }
 };  };
   
Line 718 
Line 722 
         compose_extension(msg, "expand-path@openssh.com", "1");          compose_extension(msg, "expand-path@openssh.com", "1");
         compose_extension(msg, "copy-data", "1");          compose_extension(msg, "copy-data", "1");
         compose_extension(msg, "home-directory", "1");          compose_extension(msg, "home-directory", "1");
           compose_extension(msg, "users-groups-by-id@openssh.com", "1");
   
         send_msg(msg);          send_msg(msg);
         sshbuf_free(msg);          sshbuf_free(msg);
Line 1678 
Line 1683 
         send_names(id, 1, &s);          send_names(id, 1, &s);
  out:   out:
         free(username);          free(username);
   }
   
   static void
   process_extended_get_users_groups_by_id(u_int32_t id)
   {
           struct passwd *user_pw;
           struct group *gr;
           struct sshbuf *uids, *gids, *usernames, *groupnames, *msg;
           int r;
           u_int n, nusers = 0, ngroups = 0;
           const char *name;
   
           if ((usernames = sshbuf_new()) == NULL ||
               (groupnames = sshbuf_new()) == NULL ||
               (msg = sshbuf_new()) == NULL)
                   fatal_f("sshbuf_new failed");
           if ((r = sshbuf_froms(iqueue, &uids)) != 0 ||
               (r = sshbuf_froms(iqueue, &gids)) != 0)
                   fatal_fr(r, "parse");
           debug_f("uids len = %zu, gids len = %zu",
               sshbuf_len(uids), sshbuf_len(gids));
           while (sshbuf_len(uids) != 0) {
                   if ((r = sshbuf_get_u32(uids, &n)) != 0)
                           fatal_fr(r, "parse inner uid");
                   user_pw = getpwuid((uid_t)n);
                   name = user_pw == NULL ? "" : user_pw->pw_name;
                   debug3_f("uid %u => \"%s\"", n, name);
                   if ((r = sshbuf_put_cstring(usernames, name)) != 0)
                           fatal_fr(r, "assemble gid reply");
                   nusers++;
           }
           while (sshbuf_len(gids) != 0) {
                   if ((r = sshbuf_get_u32(gids, &n)) != 0)
                           fatal_fr(r, "parse inner gid");
                   gr = getgrgid((gid_t)n);
                   name = gr == NULL ? "" : gr->gr_name;
                   debug3_f("gid %u => \"%s\"", n, name);
                   if ((r = sshbuf_put_cstring(groupnames, name)) != 0)
                           fatal_fr(r, "assemble gid reply");
                   nusers++;
           }
           verbose("users-groups-by-id: %u users, %u groups", nusers, ngroups);
   
           if ((r = sshbuf_put_u8(msg, SSH2_FXP_EXTENDED_REPLY)) != 0 ||
               (r = sshbuf_put_u32(msg, id)) != 0 ||
               (r = sshbuf_put_stringb(msg, usernames)) != 0 ||
               (r = sshbuf_put_stringb(msg, groupnames)) != 0)
                   fatal_fr(r, "compose");
           send_msg(msg);
   
           sshbuf_free(uids);
           sshbuf_free(gids);
           sshbuf_free(usernames);
           sshbuf_free(groupnames);
           sshbuf_free(msg);
 }  }
   
 static void  static void

Legend:
Removed from v.1.142  
changed lines
  Added in v.1.143