diff options
author | jp161948 <none@none> | 2006-09-19 04:24:41 -0700 |
---|---|---|
committer | jp161948 <none@none> | 2006-09-19 04:24:41 -0700 |
commit | 26ba198477055398633f319757f934b7ce73784e (patch) | |
tree | af1fc5a615d40fd013ee35e3b321d1933d5483d4 /usr/src/cmd/ssh/libssh/common/buffer.c | |
parent | 27fbcf8a5036d0cea1c401094c8bb0731ddc87ec (diff) | |
download | illumos-gate-26ba198477055398633f319757f934b7ce73784e.tar.gz |
6448031 ssh-keygen does not overwrite old key information when told yes
6451031 broken key in authorized_keys causes sshd to exit
6455367 ssh-agent can accept connections from other users depending on permissions of socket directory
6457202 server side of scp creates a directory even when not in recursive mode
6457241 server side of scp allows dir creation outside of the target subdirectory
6457952 scp performs local copying even when expected target directory is not a directory
6457959 scp doesn't print stderr messages in certain situations
6466048 scp should not call write() for the last chunk of data twice
6468175 sshd may set MAIL variable with two slashes in a row
Diffstat (limited to 'usr/src/cmd/ssh/libssh/common/buffer.c')
-rw-r--r-- | usr/src/cmd/ssh/libssh/common/buffer.c | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/usr/src/cmd/ssh/libssh/common/buffer.c b/usr/src/cmd/ssh/libssh/common/buffer.c index f0168e4ba3..9d95851d68 100644 --- a/usr/src/cmd/ssh/libssh/common/buffer.c +++ b/usr/src/cmd/ssh/libssh/common/buffer.c @@ -12,7 +12,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: buffer.c,v 1.16 2002/06/26 08:54:18 markus Exp $"); +RCSID("$OpenBSD: buffer.c,v 1.23 2005/03/14 11:46:56 markus Exp $"); #pragma ident "%Z%%M% %I% %E% SMI" @@ -41,6 +41,7 @@ buffer_free(Buffer *buffer) { if (buffer->alloc > 0) { memset(buffer->buf, 0, buffer->alloc); + buffer->alloc = 0; xfree(buffer->buf); } } @@ -79,7 +80,7 @@ buffer_append_space(Buffer *buffer, u_int len) u_int newlen; void *p; - if (len > 0x100000) + if (len > BUFFER_MAX_CHUNK) fatal("buffer_append_space: len %u not supported", len); /* If the buffer is empty, start using it from the beginning. */ @@ -98,7 +99,7 @@ restart: * If the buffer is quite empty, but all data is at the end, move the * data to the beginning and retry. */ - if (buffer->offset > buffer->alloc / 2) { + if (buffer->offset > MIN(buffer->alloc, BUFFER_MAX_CHUNK)) { memmove(buffer->buf, buffer->buf + buffer->offset, buffer->end - buffer->offset); buffer->end -= buffer->offset; @@ -108,7 +109,7 @@ restart: /* Increase the size of the buffer and retry. */ newlen = buffer->alloc + len + 32768; - if (newlen > 0xa00000) + if (newlen > BUFFER_MAX_LEN) fatal("buffer_append_space: alloc %u not supported", newlen); buffer->buf = xrealloc(buffer->buf, newlen); @@ -127,34 +128,62 @@ buffer_len(Buffer *buffer) /* Gets data from the beginning of the buffer. */ -void -buffer_get(Buffer *buffer, void *buf, u_int len) +int +buffer_get_ret(Buffer *buffer, void *buf, u_int len) { - if (len > buffer->end - buffer->offset) - fatal("buffer_get: trying to get more bytes %d than in buffer %d", + if (len > buffer->end - buffer->offset) { + error("buffer_get_ret: trying to get more bytes %d than in buffer %d", len, buffer->end - buffer->offset); + return (-1); + } memcpy(buf, buffer->buf + buffer->offset, len); buffer->offset += len; + return (0); +} + +void +buffer_get(Buffer *buffer, void *buf, u_int len) +{ + if (buffer_get_ret(buffer, buf, len) == -1) + fatal("buffer_get: buffer error"); } /* Consumes the given number of bytes from the beginning of the buffer. */ +int +buffer_consume_ret(Buffer *buffer, u_int bytes) +{ + if (bytes > buffer->end - buffer->offset) { + error("buffer_consume_ret: trying to get more bytes than in buffer"); + return (-1); + } + buffer->offset += bytes; + return (0); +} + void buffer_consume(Buffer *buffer, u_int bytes) { - if (bytes > buffer->end - buffer->offset) - fatal("buffer_consume: trying to get more bytes than in buffer"); - buffer->offset += bytes; + if (buffer_consume_ret(buffer, bytes) == -1) + fatal("buffer_consume: buffer error"); } /* Consumes the given number of bytes from the end of the buffer. */ +int +buffer_consume_end_ret(Buffer *buffer, u_int bytes) +{ + if (bytes > buffer->end - buffer->offset) + return (-1); + buffer->end -= bytes; + return (0); +} + void buffer_consume_end(Buffer *buffer, u_int bytes) { - if (bytes > buffer->end - buffer->offset) + if (buffer_consume_end_ret(buffer, bytes) == -1) fatal("buffer_consume_end: trying to get more bytes than in buffer"); - buffer->end -= bytes; } /* Returns a pointer to the first used byte in the buffer. */ @@ -170,7 +199,7 @@ buffer_ptr(Buffer *buffer) void buffer_dump(Buffer *buffer) { - int i; + u_int i; u_char *ucp = buffer->buf; for (i = buffer->offset; i < buffer->end; i++) { |