version 1.125, 2017/05/30 08:49:32 |
version 1.126, 2017/05/31 09:15:42 |
|
|
u_char buf[1024]; |
u_char buf[1024]; |
size_t len; |
size_t len; |
struct stat st; |
struct stat st; |
int r, dontmax = 0; |
int r; |
|
|
if (fstat(fd, &st) < 0) |
if (fstat(fd, &st) < 0) |
return SSH_ERR_SYSTEM_ERROR; |
return SSH_ERR_SYSTEM_ERROR; |
if ((st.st_mode & (S_IFSOCK|S_IFCHR|S_IFIFO)) == 0 && |
if ((st.st_mode & (S_IFSOCK|S_IFCHR|S_IFIFO)) == 0 && |
st.st_size > MAX_KEY_FILE_SIZE) |
st.st_size > MAX_KEY_FILE_SIZE) |
return SSH_ERR_INVALID_FORMAT; |
return SSH_ERR_INVALID_FORMAT; |
/* |
|
* Pre-allocate the buffer used for the key contents and clamp its |
|
* maximum size. This ensures that key contents are never leaked via |
|
* implicit realloc() in the sshbuf code. |
|
*/ |
|
if ((st.st_mode & S_IFREG) == 0 || st.st_size <= 0) { |
|
st.st_size = 64*1024; /* 64k ought to be enough for anybody. :) */ |
|
dontmax = 1; |
|
} |
|
if ((r = sshbuf_allocate(blob, st.st_size)) != 0 || |
|
(dontmax && (r = sshbuf_set_max_size(blob, st.st_size)) != 0)) |
|
return r; |
|
for (;;) { |
for (;;) { |
if ((len = atomicio(read, fd, buf, sizeof(buf))) == 0) { |
if ((len = atomicio(read, fd, buf, sizeof(buf))) == 0) { |
if (errno == EPIPE) |
if (errno == EPIPE) |