diff options
author | Damien Miller <djm@cvs.openbsd.org> | 2016-11-25 23:22:05 +0000 |
---|---|---|
committer | Damien Miller <djm@cvs.openbsd.org> | 2016-11-25 23:22:05 +0000 |
commit | 6b4db37a9a692460781ab918dd8d05337ad0b2ff (patch) | |
tree | a07244b5e9d19977906530245c35803cc41aeaa1 /usr.bin | |
parent | 005c4a9f5eb4647a336c954ca1304f123bc26feb (diff) |
split allocation out of sshbuf_reserve() into a separate
sshbuf_allocate() function; ok markus@
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/ssh/sshbuf.c | 76 | ||||
-rw-r--r-- | usr.bin/ssh/sshbuf.h | 10 |
2 files changed, 52 insertions, 34 deletions
diff --git a/usr.bin/ssh/sshbuf.c b/usr.bin/ssh/sshbuf.c index 9be20028a2d..594ff25500b 100644 --- a/usr.bin/ssh/sshbuf.c +++ b/usr.bin/ssh/sshbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.c,v 1.7 2016/09/12 01:22:38 deraadt Exp $ */ +/* $OpenBSD: sshbuf.c,v 1.8 2016/11/25 23:22:04 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -314,16 +314,13 @@ sshbuf_check_reserve(const struct sshbuf *buf, size_t len) } int -sshbuf_reserve(struct sshbuf *buf, size_t len, u_char **dpp) +sshbuf_allocate(struct sshbuf *buf, size_t len) { size_t rlen, need; u_char *dp; int r; - if (dpp != NULL) - *dpp = NULL; - - SSHBUF_DBG(("reserve buf = %p len = %zu", buf, len)); + SSHBUF_DBG(("allocate buf = %p len = %zu", buf, len)); if ((r = sshbuf_check_reserve(buf, len)) != 0) return r; /* @@ -331,36 +328,49 @@ sshbuf_reserve(struct sshbuf *buf, size_t len, u_char **dpp) * then pack the buffer, zeroing buf->off. */ sshbuf_maybe_pack(buf, buf->size + len > buf->max_size); - SSHBUF_TELL("reserve"); - if (len + buf->size > buf->alloc) { - /* - * Prefer to alloc in SSHBUF_SIZE_INC units, but - * allocate less if doing so would overflow max_size. - */ - need = len + buf->size - buf->alloc; - rlen = ROUNDUP(buf->alloc + need, SSHBUF_SIZE_INC); - SSHBUF_DBG(("need %zu initial rlen %zu", need, rlen)); - if (rlen > buf->max_size) - rlen = buf->alloc + need; - SSHBUF_DBG(("adjusted rlen %zu", rlen)); - if ((dp = realloc(buf->d, rlen)) == NULL) { - SSHBUF_DBG(("realloc fail")); - if (dpp != NULL) - *dpp = NULL; - return SSH_ERR_ALLOC_FAIL; - } - buf->alloc = rlen; - buf->cd = buf->d = dp; - if ((r = sshbuf_check_reserve(buf, len)) < 0) { - /* shouldn't fail */ - if (dpp != NULL) - *dpp = NULL; - return r; - } + SSHBUF_TELL("allocate"); + if (len + buf->size <= buf->alloc) + return 0; /* already have it. */ + + /* + * Prefer to alloc in SSHBUF_SIZE_INC units, but + * allocate less if doing so would overflow max_size. + */ + need = len + buf->size - buf->alloc; + rlen = ROUNDUP(buf->alloc + need, SSHBUF_SIZE_INC); + SSHBUF_DBG(("need %zu initial rlen %zu", need, rlen)); + if (rlen > buf->max_size) + rlen = buf->alloc + need; + SSHBUF_DBG(("adjusted rlen %zu", rlen)); + if ((dp = realloc(buf->d, rlen)) == NULL) { + SSHBUF_DBG(("realloc fail")); + return SSH_ERR_ALLOC_FAIL; + } + buf->alloc = rlen; + buf->cd = buf->d = dp; + if ((r = sshbuf_check_reserve(buf, len)) < 0) { + /* shouldn't fail */ + return r; } + SSHBUF_TELL("done"); + return 0; +} + +int +sshbuf_reserve(struct sshbuf *buf, size_t len, u_char **dpp) +{ + u_char *dp; + int r; + + if (dpp != NULL) + *dpp = NULL; + + SSHBUF_DBG(("reserve buf = %p len = %zu", buf, len)); + if ((r = sshbuf_allocate(buf, len)) != 0) + return r; + dp = buf->d + buf->size; buf->size += len; - SSHBUF_TELL("done"); if (dpp != NULL) *dpp = dp; return 0; diff --git a/usr.bin/ssh/sshbuf.h b/usr.bin/ssh/sshbuf.h index e66d531b124..a9d94dfeed1 100644 --- a/usr.bin/ssh/sshbuf.h +++ b/usr.bin/ssh/sshbuf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.h,v 1.7 2016/05/02 08:49:03 djm Exp $ */ +/* $OpenBSD: sshbuf.h,v 1.8 2016/11/25 23:22:04 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -135,6 +135,14 @@ u_char *sshbuf_mutable_ptr(const struct sshbuf *buf); int sshbuf_check_reserve(const struct sshbuf *buf, size_t len); /* + * Preallocates len additional bytes in buf. + * Useful for cases where the caller knows how many bytes will ultimately be + * required to avoid realloc in the buffer code. + * Returns 0 on success, or a negative SSH_ERR_* error code on failure. + */ +int sshbuf_allocate(struct sshbuf *buf, size_t len); + +/* * Reserve len bytes in buf. * Returns 0 on success and a pointer to the first reserved byte via the * optional dpp parameter or a negative * SSH_ERR_* error code on failure. |