[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.30 and 1.30.2.3

version 1.30, 2001/07/31 12:42:50 version 1.30.2.3, 2002/06/26 18:22:36
Line 1 
Line 1 
 /*  /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.   * Copyright (c) 2000, 2001, 2002 Markus Friedl.  All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions   * modification, are permitted provided that the following conditions
Line 138 
Line 138 
 {  {
         int i;          int i;
   
         for(i = 0; i < sizeof(handles)/sizeof(Handle); i++)          for (i = 0; i < sizeof(handles)/sizeof(Handle); i++)
                 handles[i].use = HANDLE_UNUSED;                  handles[i].use = HANDLE_UNUSED;
 }  }
   
Line 147 
Line 147 
 {  {
         int i;          int i;
   
         for(i = 0; i < sizeof(handles)/sizeof(Handle); i++) {          for (i = 0; i < sizeof(handles)/sizeof(Handle); i++) {
                 if (handles[i].use == HANDLE_UNUSED) {                  if (handles[i].use == HANDLE_UNUSED) {
                         handles[i].use = use;                          handles[i].use = use;
                         handles[i].dirp = dirp;                          handles[i].dirp = dirp;
Line 276 
Line 276 
                 "Unknown error"                 /* Others */                  "Unknown error"                 /* Others */
         };          };
   
         TRACE("sent status id %d error %d", id, error);          TRACE("sent status id %u error %u", id, error);
         buffer_init(&msg);          buffer_init(&msg);
         buffer_put_char(&msg, SSH2_FXP_STATUS);          buffer_put_char(&msg, SSH2_FXP_STATUS);
         buffer_put_int(&msg, id);          buffer_put_int(&msg, id);
Line 305 
Line 305 
 static void  static void
 send_data(u_int32_t id, char *data, int dlen)  send_data(u_int32_t id, char *data, int dlen)
 {  {
         TRACE("sent data id %d len %d", id, dlen);          TRACE("sent data id %u len %d", id, dlen);
         send_data_or_handle(SSH2_FXP_DATA, id, data, dlen);          send_data_or_handle(SSH2_FXP_DATA, id, data, dlen);
 }  }
   
Line 316 
Line 316 
         int hlen;          int hlen;
   
         handle_to_string(handle, &string, &hlen);          handle_to_string(handle, &string, &hlen);
         TRACE("sent handle id %d handle %d", id, handle);          TRACE("sent handle id %u handle %d", id, handle);
         send_data_or_handle(SSH2_FXP_HANDLE, id, string, hlen);          send_data_or_handle(SSH2_FXP_HANDLE, id, string, hlen);
         xfree(string);          xfree(string);
 }  }
Line 331 
Line 331 
         buffer_put_char(&msg, SSH2_FXP_NAME);          buffer_put_char(&msg, SSH2_FXP_NAME);
         buffer_put_int(&msg, id);          buffer_put_int(&msg, id);
         buffer_put_int(&msg, count);          buffer_put_int(&msg, count);
         TRACE("sent names id %d count %d", id, count);          TRACE("sent names id %u count %d", id, count);
         for (i = 0; i < count; i++) {          for (i = 0; i < count; i++) {
                 buffer_put_cstring(&msg, stats[i].name);                  buffer_put_cstring(&msg, stats[i].name);
                 buffer_put_cstring(&msg, stats[i].long_name);                  buffer_put_cstring(&msg, stats[i].long_name);
Line 346 
Line 346 
 {  {
         Buffer msg;          Buffer msg;
   
         TRACE("sent attrib id %d have 0x%x", id, a->flags);          TRACE("sent attrib id %u have 0x%x", id, a->flags);
         buffer_init(&msg);          buffer_init(&msg);
         buffer_put_char(&msg, SSH2_FXP_ATTRS);          buffer_put_char(&msg, SSH2_FXP_ATTRS);
         buffer_put_int(&msg, id);          buffer_put_int(&msg, id);
Line 362 
Line 362 
 {  {
         Buffer msg;          Buffer msg;
   
         version = buffer_get_int(&iqueue);          version = get_int();
         TRACE("client version %d", version);          TRACE("client version %d", version);
         buffer_init(&msg);          buffer_init(&msg);
         buffer_put_char(&msg, SSH2_FXP_VERSION);          buffer_put_char(&msg, SSH2_FXP_VERSION);
Line 385 
Line 385 
         a = get_attrib();          a = get_attrib();
         flags = flags_from_portable(pflags);          flags = flags_from_portable(pflags);
         mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666;          mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666;
         TRACE("open id %d name %s flags %d mode 0%o", id, name, pflags, mode);          TRACE("open id %u name %s flags %d mode 0%o", id, name, pflags, mode);
         fd = open(name, flags, mode);          fd = open(name, flags, mode);
         if (fd < 0) {          if (fd < 0) {
                 status = errno_to_portable(errno);                  status = errno_to_portable(errno);
Line 411 
Line 411 
   
         id = get_int();          id = get_int();
         handle = get_handle();          handle = get_handle();
         TRACE("close id %d handle %d", id, handle);          TRACE("close id %u handle %d", id, handle);
         ret = handle_close(handle);          ret = handle_close(handle);
         status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;          status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
         send_status(id, status);          send_status(id, status);
Line 430 
Line 430 
         off = get_int64();          off = get_int64();
         len = get_int();          len = get_int();
   
         TRACE("read id %d handle %d off %llu len %d", id, handle,          TRACE("read id %u handle %d off %llu len %d", id, handle,
             (unsigned long long)off, len);              (unsigned long long)off, len);
         if (len > sizeof buf) {          if (len > sizeof buf) {
                 len = sizeof buf;                  len = sizeof buf;
Line 471 
Line 471 
         off = get_int64();          off = get_int64();
         data = get_string(&len);          data = get_string(&len);
   
         TRACE("write id %d handle %d off %llu len %d", id, handle,          TRACE("write id %u handle %d off %llu len %d", id, handle,
             (unsigned long long)off, len);              (unsigned long long)off, len);
         fd = handle_to_fd(handle);          fd = handle_to_fd(handle);
         if (fd >= 0) {          if (fd >= 0) {
Line 506 
Line 506 
   
         id = get_int();          id = get_int();
         name = get_string(NULL);          name = get_string(NULL);
         TRACE("%sstat id %d name %s", do_lstat ? "l" : "", id, name);          TRACE("%sstat id %u name %s", do_lstat ? "l" : "", id, name);
         ret = do_lstat ? lstat(name, &st) : stat(name, &st);          ret = do_lstat ? lstat(name, &st) : stat(name, &st);
         if (ret < 0) {          if (ret < 0) {
                 status = errno_to_portable(errno);                  status = errno_to_portable(errno);
Line 542 
Line 542 
   
         id = get_int();          id = get_int();
         handle = get_handle();          handle = get_handle();
         TRACE("fstat id %d handle %d", id, handle);          TRACE("fstat id %u handle %d", id, handle);
         fd = handle_to_fd(handle);          fd = handle_to_fd(handle);
         if (fd  >= 0) {          if (fd  >= 0) {
                 ret = fstat(fd, &st);                  ret = fstat(fd, &st);
Line 576 
Line 576 
         Attrib *a;          Attrib *a;
         u_int32_t id;          u_int32_t id;
         char *name;          char *name;
         int ret;          int status = SSH2_FX_OK, ret;
         int status = SSH2_FX_OK;  
   
         id = get_int();          id = get_int();
         name = get_string(NULL);          name = get_string(NULL);
         a = get_attrib();          a = get_attrib();
         TRACE("setstat id %d name %s", id, name);          TRACE("setstat id %u name %s", id, name);
           if (a->flags & SSH2_FILEXFER_ATTR_SIZE) {
                   ret = truncate(name, a->size);
                   if (ret == -1)
                           status = errno_to_portable(errno);
           }
         if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {          if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {
                 ret = chmod(name, a->perm & 0777);                  ret = chmod(name, a->perm & 0777);
                 if (ret == -1)                  if (ret == -1)
Line 613 
Line 617 
         id = get_int();          id = get_int();
         handle = get_handle();          handle = get_handle();
         a = get_attrib();          a = get_attrib();
         TRACE("fsetstat id %d handle %d", id, handle);          TRACE("fsetstat id %u handle %d", id, handle);
         fd = handle_to_fd(handle);          fd = handle_to_fd(handle);
         if (fd < 0) {          if (fd < 0) {
                 status = SSH2_FX_FAILURE;                  status = SSH2_FX_FAILURE;
         } else {          } else {
                   if (a->flags & SSH2_FILEXFER_ATTR_SIZE) {
                           ret = ftruncate(fd, a->size);
                           if (ret == -1)
                                   status = errno_to_portable(errno);
                   }
                 if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {                  if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {
                         ret = fchmod(fd, a->perm & 0777);                          ret = fchmod(fd, a->perm & 0777);
                         if (ret == -1)                          if (ret == -1)
Line 647 
Line 656 
   
         id = get_int();          id = get_int();
         path = get_string(NULL);          path = get_string(NULL);
         TRACE("opendir id %d path %s", id, path);          TRACE("opendir id %u path %s", id, path);
         dirp = opendir(path);          dirp = opendir(path);
         if (dirp == NULL) {          if (dirp == NULL) {
                 status = errno_to_portable(errno);                  status = errno_to_portable(errno);
Line 683 
Line 692 
         if ((pw = getpwuid(st->st_uid)) != NULL) {          if ((pw = getpwuid(st->st_uid)) != NULL) {
                 user = pw->pw_name;                  user = pw->pw_name;
         } else {          } else {
                 snprintf(ubuf, sizeof ubuf, "%d", st->st_uid);                  snprintf(ubuf, sizeof ubuf, "%u", (u_int)st->st_uid);
                 user = ubuf;                  user = ubuf;
         }          }
         if ((gr = getgrgid(st->st_gid)) != NULL) {          if ((gr = getgrgid(st->st_gid)) != NULL) {
                 group = gr->gr_name;                  group = gr->gr_name;
         } else {          } else {
                 snprintf(gbuf, sizeof gbuf, "%d", st->st_gid);                  snprintf(gbuf, sizeof gbuf, "%u", (u_int)st->st_gid);
                 group = gbuf;                  group = gbuf;
         }          }
         if (ltime != NULL) {          if (ltime != NULL) {
Line 719 
Line 728 
   
         id = get_int();          id = get_int();
         handle = get_handle();          handle = get_handle();
         TRACE("readdir id %d handle %d", id, handle);          TRACE("readdir id %u handle %d", id, handle);
         dirp = handle_to_dir(handle);          dirp = handle_to_dir(handle);
         path = handle_to_name(handle);          path = handle_to_name(handle);
         if (dirp == NULL || path == NULL) {          if (dirp == NULL || path == NULL) {
Line 729 
Line 738 
                 char pathname[1024];                  char pathname[1024];
                 Stat *stats;                  Stat *stats;
                 int nstats = 10, count = 0, i;                  int nstats = 10, count = 0, i;
   
                 stats = xmalloc(nstats * sizeof(Stat));                  stats = xmalloc(nstats * sizeof(Stat));
                 while ((dp = readdir(dirp)) != NULL) {                  while ((dp = readdir(dirp)) != NULL) {
                         if (count >= nstats) {                          if (count >= nstats) {
Line 751 
Line 761 
                 }                  }
                 if (count > 0) {                  if (count > 0) {
                         send_names(id, count, stats);                          send_names(id, count, stats);
                         for(i = 0; i < count; i++) {                          for (i = 0; i < count; i++) {
                                 xfree(stats[i].name);                                  xfree(stats[i].name);
                                 xfree(stats[i].long_name);                                  xfree(stats[i].long_name);
                         }                          }
Line 772 
Line 782 
   
         id = get_int();          id = get_int();
         name = get_string(NULL);          name = get_string(NULL);
         TRACE("remove id %d name %s", id, name);          TRACE("remove id %u name %s", id, name);
         ret = unlink(name);          ret = unlink(name);
         status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;          status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
         send_status(id, status);          send_status(id, status);
Line 792 
Line 802 
         a = get_attrib();          a = get_attrib();
         mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ?          mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ?
             a->perm & 0777 : 0777;              a->perm & 0777 : 0777;
         TRACE("mkdir id %d name %s mode 0%o", id, name, mode);          TRACE("mkdir id %u name %s mode 0%o", id, name, mode);
         ret = mkdir(name, mode);          ret = mkdir(name, mode);
         status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;          status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
         send_status(id, status);          send_status(id, status);
Line 808 
Line 818 
   
         id = get_int();          id = get_int();
         name = get_string(NULL);          name = get_string(NULL);
         TRACE("rmdir id %d name %s", id, name);          TRACE("rmdir id %u name %s", id, name);
         ret = rmdir(name);          ret = rmdir(name);
         status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;          status = (ret == -1) ? errno_to_portable(errno) : SSH2_FX_OK;
         send_status(id, status);          send_status(id, status);
Line 828 
Line 838 
                 xfree(path);                  xfree(path);
                 path = xstrdup(".");                  path = xstrdup(".");
         }          }
         TRACE("realpath id %d path %s", id, path);          TRACE("realpath id %u path %s", id, path);
         if (realpath(path, resolvedname) == NULL) {          if (realpath(path, resolvedname) == NULL) {
                 send_status(id, errno_to_portable(errno));                  send_status(id, errno_to_portable(errno));
         } else {          } else {
Line 851 
Line 861 
         id = get_int();          id = get_int();
         oldpath = get_string(NULL);          oldpath = get_string(NULL);
         newpath = get_string(NULL);          newpath = get_string(NULL);
         TRACE("rename id %d old %s new %s", id, oldpath, newpath);          TRACE("rename id %u old %s new %s", id, oldpath, newpath);
         /* fail if 'newpath' exists */          /* fail if 'newpath' exists */
         if (stat(newpath, &st) == -1) {          if (stat(newpath, &st) == -1) {
                 ret = rename(oldpath, newpath);                  ret = rename(oldpath, newpath);
Line 872 
Line 882 
   
         id = get_int();          id = get_int();
         path = get_string(NULL);          path = get_string(NULL);
         TRACE("readlink id %d path %s", id, path);          TRACE("readlink id %u path %s", id, path);
         if ((len = readlink(path, link, sizeof(link) - 1)) == -1)          if ((len = readlink(path, link, sizeof(link) - 1)) == -1)
                 send_status(id, errno_to_portable(errno));                  send_status(id, errno_to_portable(errno));
         else {          else {
                 Stat s;                  Stat s;
   
                 link[len] = '\0';                  link[len] = '\0';
                 attrib_clear(&s.attrib);                  attrib_clear(&s.attrib);
                 s.name = s.long_name = link;                  s.name = s.long_name = link;
Line 897 
Line 907 
         id = get_int();          id = get_int();
         oldpath = get_string(NULL);          oldpath = get_string(NULL);
         newpath = get_string(NULL);          newpath = get_string(NULL);
         TRACE("symlink id %d old %s new %s", id, oldpath, newpath);          TRACE("symlink id %u old %s new %s", id, oldpath, newpath);
         /* fail if 'newpath' exists */          /* fail if 'newpath' exists */
         if (stat(newpath, &st) == -1) {          if (stat(newpath, &st) == -1) {
                 ret = symlink(oldpath, newpath);                  ret = symlink(oldpath, newpath);
Line 926 
Line 936 
 process(void)  process(void)
 {  {
         u_int msg_len;          u_int msg_len;
           u_int buf_len;
           u_int consumed;
         u_int type;          u_int type;
         u_char *cp;          u_char *cp;
   
         if (buffer_len(&iqueue) < 5)          buf_len = buffer_len(&iqueue);
           if (buf_len < 5)
                 return;         /* Incomplete message. */                  return;         /* Incomplete message. */
         cp = (u_char *) buffer_ptr(&iqueue);          cp = buffer_ptr(&iqueue);
         msg_len = GET_32BIT(cp);          msg_len = GET_32BIT(cp);
         if (msg_len > 256 * 1024) {          if (msg_len > 256 * 1024) {
                 error("bad message ");                  error("bad message ");
                 exit(11);                  exit(11);
         }          }
         if (buffer_len(&iqueue) < msg_len + 4)          if (buf_len < msg_len + 4)
                 return;                  return;
         buffer_consume(&iqueue, 4);          buffer_consume(&iqueue, 4);
           buf_len -= 4;
         type = buffer_get_char(&iqueue);          type = buffer_get_char(&iqueue);
         switch (type) {          switch (type) {
         case SSH2_FXP_INIT:          case SSH2_FXP_INIT:
Line 1006 
Line 1020 
                 error("Unknown message %d", type);                  error("Unknown message %d", type);
                 break;                  break;
         }          }
           /* discard the remaining bytes from the current packet */
           if (buf_len < buffer_len(&iqueue))
                   fatal("iqueue grows");
           consumed = buf_len - buffer_len(&iqueue);
           if (msg_len < consumed)
                   fatal("msg_len %d < consumed %d", msg_len, consumed);
           if (msg_len > consumed)
                   buffer_consume(&iqueue, msg_len - consumed);
 }  }
   
 int  int

Legend:
Removed from v.1.30  
changed lines
  Added in v.1.30.2.3