summaryrefslogtreecommitdiff
path: root/usr/src/cmd/ssh/libssh/common/buffer.c
diff options
context:
space:
mode:
authorjp161948 <none@none>2006-09-19 04:24:41 -0700
committerjp161948 <none@none>2006-09-19 04:24:41 -0700
commit26ba198477055398633f319757f934b7ce73784e (patch)
treeaf1fc5a615d40fd013ee35e3b321d1933d5483d4 /usr/src/cmd/ssh/libssh/common/buffer.c
parent27fbcf8a5036d0cea1c401094c8bb0731ddc87ec (diff)
downloadillumos-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.c57
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++) {