| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssh/src/sshbuf.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* $OpenBSD: sshbuf.c,v 1.12 2018/07/09 21:56:06 markus Exp $ */ | - | ||||||||||||||||||
| 2 | /* | - | ||||||||||||||||||
| 3 | * Copyright (c) 2011 Damien Miller | - | ||||||||||||||||||
| 4 | * | - | ||||||||||||||||||
| 5 | * Permission to use, copy, modify, and distribute this software for any | - | ||||||||||||||||||
| 6 | * purpose with or without fee is hereby granted, provided that the above | - | ||||||||||||||||||
| 7 | * copyright notice and this permission notice appear in all copies. | - | ||||||||||||||||||
| 8 | * | - | ||||||||||||||||||
| 9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | - | ||||||||||||||||||
| 10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | - | ||||||||||||||||||
| 11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | - | ||||||||||||||||||
| 12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | - | ||||||||||||||||||
| 13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | - | ||||||||||||||||||
| 14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | - | ||||||||||||||||||
| 15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | - | ||||||||||||||||||
| 16 | */ | - | ||||||||||||||||||
| 17 | - | |||||||||||||||||||
| 18 | #define SSHBUF_INTERNAL | - | ||||||||||||||||||
| 19 | #include "includes.h" | - | ||||||||||||||||||
| 20 | - | |||||||||||||||||||
| 21 | #include <sys/types.h> | - | ||||||||||||||||||
| 22 | #include <signal.h> | - | ||||||||||||||||||
| 23 | #include <stdlib.h> | - | ||||||||||||||||||
| 24 | #include <stdio.h> | - | ||||||||||||||||||
| 25 | #include <string.h> | - | ||||||||||||||||||
| 26 | - | |||||||||||||||||||
| 27 | #include "ssherr.h" | - | ||||||||||||||||||
| 28 | #include "sshbuf.h" | - | ||||||||||||||||||
| 29 | #include "misc.h" | - | ||||||||||||||||||
| 30 | - | |||||||||||||||||||
| 31 | static inline int | - | ||||||||||||||||||
| 32 | sshbuf_check_sanity(const struct sshbuf *buf) | - | ||||||||||||||||||
| 33 | { | - | ||||||||||||||||||
| 34 | SSHBUF_TELL("sanity"); | - | ||||||||||||||||||
| 35 | if (__predict_false(buf == NULL ||
| 0-49736721 | ||||||||||||||||||
| 36 | (!buf->readonly && buf->d != buf->cd) || | - | ||||||||||||||||||
| 37 | buf->refcount < 1 || buf->refcount > SSHBUF_REFS_MAX || | - | ||||||||||||||||||
| 38 | buf->cd == NULL || | - | ||||||||||||||||||
| 39 | buf->max_size > SSHBUF_SIZE_MAX || | - | ||||||||||||||||||
| 40 | buf->alloc > buf->max_size || | - | ||||||||||||||||||
| 41 | buf->size > buf->alloc || | - | ||||||||||||||||||
| 42 | buf->off > buf->size)) { | - | ||||||||||||||||||
| 43 | /* Do not try to recover from corrupted buffer internals */ | - | ||||||||||||||||||
| 44 | SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); | - | ||||||||||||||||||
| 45 | signal(SIGSEGV, SIG_DFL); | - | ||||||||||||||||||
| 46 | raise(SIGSEGV); | - | ||||||||||||||||||
| 47 | return SSH_ERR_INTERNAL_ERROR; never executed: return -1; | 0 | ||||||||||||||||||
| 48 | } | - | ||||||||||||||||||
| 49 | return 0; executed 49736721 times by 6 tests: return 0;Executed by:
| 49736721 | ||||||||||||||||||
| 50 | } | - | ||||||||||||||||||
| 51 | - | |||||||||||||||||||
| 52 | static void | - | ||||||||||||||||||
| 53 | sshbuf_maybe_pack(struct sshbuf *buf, int force) | - | ||||||||||||||||||
| 54 | { | - | ||||||||||||||||||
| 55 | SSHBUF_DBG(("force %d", force)); | - | ||||||||||||||||||
| 56 | SSHBUF_TELL("pre-pack"); | - | ||||||||||||||||||
| 57 | if (buf->off == 0 || buf->readonly || buf->refcount > 1)
| 0-9797402 | ||||||||||||||||||
| 58 | return; executed 9797402 times by 6 tests: return;Executed by:
| 9797402 | ||||||||||||||||||
| 59 | if (force ||
| 16536-45548 | ||||||||||||||||||
| 60 | (buf->off >= SSHBUF_PACK_MIN && buf->off >= buf->size / 2)) {
| 0-45436 | ||||||||||||||||||
| 61 | memmove(buf->d, buf->d + buf->off, buf->size - buf->off); | - | ||||||||||||||||||
| 62 | buf->size -= buf->off; | - | ||||||||||||||||||
| 63 | buf->off = 0; | - | ||||||||||||||||||
| 64 | SSHBUF_TELL("packed"); | - | ||||||||||||||||||
| 65 | } executed 16648 times by 1 test: end of blockExecuted by:
| 16648 | ||||||||||||||||||
| 66 | } executed 62084 times by 1 test: end of blockExecuted by:
| 62084 | ||||||||||||||||||
| 67 | - | |||||||||||||||||||
| 68 | struct sshbuf * | - | ||||||||||||||||||
| 69 | sshbuf_new(void) | - | ||||||||||||||||||
| 70 | { | - | ||||||||||||||||||
| 71 | struct sshbuf *ret; | - | ||||||||||||||||||
| 72 | - | |||||||||||||||||||
| 73 | if ((ret = calloc(sizeof(*ret), 1)) == NULL)
| 0-2058693 | ||||||||||||||||||
| 74 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
| 75 | ret->alloc = SSHBUF_SIZE_INIT; | - | ||||||||||||||||||
| 76 | ret->max_size = SSHBUF_SIZE_MAX; | - | ||||||||||||||||||
| 77 | ret->readonly = 0; | - | ||||||||||||||||||
| 78 | ret->refcount = 1; | - | ||||||||||||||||||
| 79 | ret->parent = NULL; | - | ||||||||||||||||||
| 80 | if ((ret->cd = ret->d = calloc(1, ret->alloc)) == NULL) {
| 0-2058693 | ||||||||||||||||||
| 81 | free(ret); | - | ||||||||||||||||||
| 82 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
| 83 | } | - | ||||||||||||||||||
| 84 | return ret; executed 2058693 times by 6 tests: return ret;Executed by:
| 2058693 | ||||||||||||||||||
| 85 | } | - | ||||||||||||||||||
| 86 | - | |||||||||||||||||||
| 87 | struct sshbuf * | - | ||||||||||||||||||
| 88 | sshbuf_from(const void *blob, size_t len) | - | ||||||||||||||||||
| 89 | { | - | ||||||||||||||||||
| 90 | struct sshbuf *ret; | - | ||||||||||||||||||
| 91 | - | |||||||||||||||||||
| 92 | if (blob == NULL || len > SSHBUF_SIZE_MAX ||
| 0-265205 | ||||||||||||||||||
| 93 | (ret = calloc(sizeof(*ret), 1)) == NULL)
| 0-265205 | ||||||||||||||||||
| 94 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
| 95 | ret->alloc = ret->size = ret->max_size = len; | - | ||||||||||||||||||
| 96 | ret->readonly = 1; | - | ||||||||||||||||||
| 97 | ret->refcount = 1; | - | ||||||||||||||||||
| 98 | ret->parent = NULL; | - | ||||||||||||||||||
| 99 | ret->cd = blob; | - | ||||||||||||||||||
| 100 | ret->d = NULL; | - | ||||||||||||||||||
| 101 | return ret; executed 265205 times by 6 tests: return ret;Executed by:
| 265205 | ||||||||||||||||||
| 102 | } | - | ||||||||||||||||||
| 103 | - | |||||||||||||||||||
| 104 | int | - | ||||||||||||||||||
| 105 | sshbuf_set_parent(struct sshbuf *child, struct sshbuf *parent) | - | ||||||||||||||||||
| 106 | { | - | ||||||||||||||||||
| 107 | int r; | - | ||||||||||||||||||
| 108 | - | |||||||||||||||||||
| 109 | if ((r = sshbuf_check_sanity(child)) != 0 ||
| 0-132747 | ||||||||||||||||||
| 110 | (r = sshbuf_check_sanity(parent)) != 0)
| 0-132747 | ||||||||||||||||||
| 111 | return r; never executed: return r; | 0 | ||||||||||||||||||
| 112 | child->parent = parent; | - | ||||||||||||||||||
| 113 | child->parent->refcount++; | - | ||||||||||||||||||
| 114 | return 0; executed 132747 times by 6 tests: return 0;Executed by:
| 132747 | ||||||||||||||||||
| 115 | } | - | ||||||||||||||||||
| 116 | - | |||||||||||||||||||
| 117 | struct sshbuf * | - | ||||||||||||||||||
| 118 | sshbuf_fromb(struct sshbuf *buf) | - | ||||||||||||||||||
| 119 | { | - | ||||||||||||||||||
| 120 | struct sshbuf *ret; | - | ||||||||||||||||||
| 121 | - | |||||||||||||||||||
| 122 | if (sshbuf_check_sanity(buf) != 0)
| 0-43764 | ||||||||||||||||||
| 123 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
| 124 | if ((ret = sshbuf_from(sshbuf_ptr(buf), sshbuf_len(buf))) == NULL)
| 0-43764 | ||||||||||||||||||
| 125 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
| 126 | if (sshbuf_set_parent(ret, buf) != 0) {
| 0-43764 | ||||||||||||||||||
| 127 | sshbuf_free(ret); | - | ||||||||||||||||||
| 128 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
| 129 | } | - | ||||||||||||||||||
| 130 | return ret; executed 43764 times by 6 tests: return ret;Executed by:
| 43764 | ||||||||||||||||||
| 131 | } | - | ||||||||||||||||||
| 132 | - | |||||||||||||||||||
| 133 | void | - | ||||||||||||||||||
| 134 | sshbuf_free(struct sshbuf *buf) | - | ||||||||||||||||||
| 135 | { | - | ||||||||||||||||||
| 136 | if (buf == NULL)
| 2456643-2564902 | ||||||||||||||||||
| 137 | return; executed 2564902 times by 6 tests: return;Executed by:
| 2564902 | ||||||||||||||||||
| 138 | /* | - | ||||||||||||||||||
| 139 | * The following will leak on insane buffers, but this is the safest | - | ||||||||||||||||||
| 140 | * course of action - an invalid pointer or already-freed pointer may | - | ||||||||||||||||||
| 141 | * have been passed to us and continuing to scribble over memory would | - | ||||||||||||||||||
| 142 | * be bad. | - | ||||||||||||||||||
| 143 | */ | - | ||||||||||||||||||
| 144 | if (sshbuf_check_sanity(buf) != 0)
| 0-2456643 | ||||||||||||||||||
| 145 | return; never executed: return; | 0 | ||||||||||||||||||
| 146 | /* | - | ||||||||||||||||||
| 147 | * If we are a child, the free our parent to decrement its reference | - | ||||||||||||||||||
| 148 | * count and possibly free it. | - | ||||||||||||||||||
| 149 | */ | - | ||||||||||||||||||
| 150 | sshbuf_free(buf->parent); | - | ||||||||||||||||||
| 151 | buf->parent = NULL; | - | ||||||||||||||||||
| 152 | /* | - | ||||||||||||||||||
| 153 | * If we are a parent with still-extant children, then don't free just | - | ||||||||||||||||||
| 154 | * yet. The last child's call to sshbuf_free should decrement our | - | ||||||||||||||||||
| 155 | * refcount to 0 and trigger the actual free. | - | ||||||||||||||||||
| 156 | */ | - | ||||||||||||||||||
| 157 | buf->refcount--; | - | ||||||||||||||||||
| 158 | if (buf->refcount > 0)
| 132747-2323896 | ||||||||||||||||||
| 159 | return; executed 132747 times by 6 tests: return;Executed by:
| 132747 | ||||||||||||||||||
| 160 | if (!buf->readonly) {
| 265205-2058691 | ||||||||||||||||||
| 161 | explicit_bzero(buf->d, buf->alloc); | - | ||||||||||||||||||
| 162 | free(buf->d); | - | ||||||||||||||||||
| 163 | } executed 2058691 times by 6 tests: end of blockExecuted by:
| 2058691 | ||||||||||||||||||
| 164 | explicit_bzero(buf, sizeof(*buf)); | - | ||||||||||||||||||
| 165 | free(buf); | - | ||||||||||||||||||
| 166 | } executed 2323896 times by 6 tests: end of blockExecuted by:
| 2323896 | ||||||||||||||||||
| 167 | - | |||||||||||||||||||
| 168 | void | - | ||||||||||||||||||
| 169 | sshbuf_reset(struct sshbuf *buf) | - | ||||||||||||||||||
| 170 | { | - | ||||||||||||||||||
| 171 | u_char *d; | - | ||||||||||||||||||
| 172 | - | |||||||||||||||||||
| 173 | if (buf->readonly || buf->refcount > 1) {
| 0-258629 | ||||||||||||||||||
| 174 | /* Nonsensical. Just make buffer appear empty */ | - | ||||||||||||||||||
| 175 | buf->off = buf->size; | - | ||||||||||||||||||
| 176 | return; never executed: return; | 0 | ||||||||||||||||||
| 177 | } | - | ||||||||||||||||||
| 178 | (void) sshbuf_check_sanity(buf); | - | ||||||||||||||||||
| 179 | buf->off = buf->size = 0; | - | ||||||||||||||||||
| 180 | if (buf->alloc != SSHBUF_SIZE_INIT) {
| 31252-227377 | ||||||||||||||||||
| 181 | if ((d = recallocarray(buf->d, buf->alloc, SSHBUF_SIZE_INIT,
| 0-227377 | ||||||||||||||||||
| 182 | 1)) != NULL) {
| 0-227377 | ||||||||||||||||||
| 183 | buf->cd = buf->d = d; | - | ||||||||||||||||||
| 184 | buf->alloc = SSHBUF_SIZE_INIT; | - | ||||||||||||||||||
| 185 | } executed 227377 times by 4 tests: end of blockExecuted by:
| 227377 | ||||||||||||||||||
| 186 | } executed 227377 times by 4 tests: end of blockExecuted by:
| 227377 | ||||||||||||||||||
| 187 | explicit_bzero(buf->d, SSHBUF_SIZE_INIT); | - | ||||||||||||||||||
| 188 | } executed 258629 times by 5 tests: end of blockExecuted by:
| 258629 | ||||||||||||||||||
| 189 | - | |||||||||||||||||||
| 190 | size_t | - | ||||||||||||||||||
| 191 | sshbuf_max_size(const struct sshbuf *buf) | - | ||||||||||||||||||
| 192 | { | - | ||||||||||||||||||
| 193 | return buf->max_size; executed 315020 times by 1 test: return buf->max_size;Executed by:
| 315020 | ||||||||||||||||||
| 194 | } | - | ||||||||||||||||||
| 195 | - | |||||||||||||||||||
| 196 | size_t | - | ||||||||||||||||||
| 197 | sshbuf_alloc(const struct sshbuf *buf) | - | ||||||||||||||||||
| 198 | { | - | ||||||||||||||||||
| 199 | return buf->alloc; executed 1 time by 1 test: return buf->alloc;Executed by:
| 1 | ||||||||||||||||||
| 200 | } | - | ||||||||||||||||||
| 201 | - | |||||||||||||||||||
| 202 | const struct sshbuf * | - | ||||||||||||||||||
| 203 | sshbuf_parent(const struct sshbuf *buf) | - | ||||||||||||||||||
| 204 | { | - | ||||||||||||||||||
| 205 | return buf->parent; executed 3 times by 1 test: return buf->parent;Executed by:
| 3 | ||||||||||||||||||
| 206 | } | - | ||||||||||||||||||
| 207 | - | |||||||||||||||||||
| 208 | u_int | - | ||||||||||||||||||
| 209 | sshbuf_refcount(const struct sshbuf *buf) | - | ||||||||||||||||||
| 210 | { | - | ||||||||||||||||||
| 211 | return buf->refcount; executed 3 times by 1 test: return buf->refcount;Executed by:
| 3 | ||||||||||||||||||
| 212 | } | - | ||||||||||||||||||
| 213 | - | |||||||||||||||||||
| 214 | int | - | ||||||||||||||||||
| 215 | sshbuf_set_max_size(struct sshbuf *buf, size_t max_size) | - | ||||||||||||||||||
| 216 | { | - | ||||||||||||||||||
| 217 | size_t rlen; | - | ||||||||||||||||||
| 218 | u_char *dp; | - | ||||||||||||||||||
| 219 | int r; | - | ||||||||||||||||||
| 220 | - | |||||||||||||||||||
| 221 | SSHBUF_DBG(("set max buf = %p len = %zu", buf, max_size)); | - | ||||||||||||||||||
| 222 | if ((r = sshbuf_check_sanity(buf)) != 0)
| 0-26457 | ||||||||||||||||||
| 223 | return r; never executed: return r; | 0 | ||||||||||||||||||
| 224 | if (max_size == buf->max_size)
| 1-26456 | ||||||||||||||||||
| 225 | return 0; executed 1 time by 1 test: return 0;Executed by:
| 1 | ||||||||||||||||||
| 226 | if (buf->readonly || buf->refcount > 1)
| 0-26455 | ||||||||||||||||||
| 227 | return SSH_ERR_BUFFER_READ_ONLY; executed 1 time by 1 test: return -49;Executed by:
| 1 | ||||||||||||||||||
| 228 | if (max_size > SSHBUF_SIZE_MAX)
| 0-26455 | ||||||||||||||||||
| 229 | return SSH_ERR_NO_BUFFER_SPACE; never executed: return -9; | 0 | ||||||||||||||||||
| 230 | /* pack and realloc if necessary */ | - | ||||||||||||||||||
| 231 | sshbuf_maybe_pack(buf, max_size < buf->size); | - | ||||||||||||||||||
| 232 | if (max_size < buf->alloc && max_size > buf->size) {
| 5581-15829 | ||||||||||||||||||
| 233 | if (buf->size < SSHBUF_SIZE_INIT)
| 197-5384 | ||||||||||||||||||
| 234 | rlen = SSHBUF_SIZE_INIT; executed 197 times by 1 test: rlen = 256;Executed by:
| 197 | ||||||||||||||||||
| 235 | else | - | ||||||||||||||||||
| 236 | rlen = ROUNDUP(buf->size, SSHBUF_SIZE_INC); executed 5384 times by 1 test: rlen = ((((buf->size)+((256)-1))/(256))*(256));Executed by:
| 5384 | ||||||||||||||||||
| 237 | if (rlen > max_size)
| 379-5202 | ||||||||||||||||||
| 238 | rlen = max_size; executed 379 times by 1 test: rlen = max_size;Executed by:
| 379 | ||||||||||||||||||
| 239 | SSHBUF_DBG(("new alloc = %zu", rlen)); | - | ||||||||||||||||||
| 240 | if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL)
| 0-5581 | ||||||||||||||||||
| 241 | return SSH_ERR_ALLOC_FAIL; never executed: return -2; | 0 | ||||||||||||||||||
| 242 | buf->cd = buf->d = dp; | - | ||||||||||||||||||
| 243 | buf->alloc = rlen; | - | ||||||||||||||||||
| 244 | } executed 5581 times by 1 test: end of blockExecuted by:
| 5581 | ||||||||||||||||||
| 245 | SSHBUF_TELL("new-max"); | - | ||||||||||||||||||
| 246 | if (max_size < buf->alloc)
| 10248-16207 | ||||||||||||||||||
| 247 | return SSH_ERR_NO_BUFFER_SPACE; executed 10248 times by 1 test: return -9;Executed by:
| 10248 | ||||||||||||||||||
| 248 | buf->max_size = max_size; | - | ||||||||||||||||||
| 249 | return 0; executed 16207 times by 1 test: return 0;Executed by:
| 16207 | ||||||||||||||||||
| 250 | } | - | ||||||||||||||||||
| 251 | - | |||||||||||||||||||
| 252 | size_t | - | ||||||||||||||||||
| 253 | sshbuf_len(const struct sshbuf *buf) | - | ||||||||||||||||||
| 254 | { | - | ||||||||||||||||||
| 255 | if (sshbuf_check_sanity(buf) != 0)
| 0-16980196 | ||||||||||||||||||
| 256 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 257 | return buf->size - buf->off; executed 16980196 times by 6 tests: return buf->size - buf->off;Executed by:
| 16980196 | ||||||||||||||||||
| 258 | } | - | ||||||||||||||||||
| 259 | - | |||||||||||||||||||
| 260 | size_t | - | ||||||||||||||||||
| 261 | sshbuf_avail(const struct sshbuf *buf) | - | ||||||||||||||||||
| 262 | { | - | ||||||||||||||||||
| 263 | if (sshbuf_check_sanity(buf) != 0 || buf->readonly || buf->refcount > 1)
| 0-471423 | ||||||||||||||||||
| 264 | return 0; executed 1 time by 1 test: return 0;Executed by:
| 1 | ||||||||||||||||||
| 265 | return buf->max_size - (buf->size - buf->off); executed 471422 times by 1 test: return buf->max_size - (buf->size - buf->off);Executed by:
| 471422 | ||||||||||||||||||
| 266 | } | - | ||||||||||||||||||
| 267 | - | |||||||||||||||||||
| 268 | const u_char * | - | ||||||||||||||||||
| 269 | sshbuf_ptr(const struct sshbuf *buf) | - | ||||||||||||||||||
| 270 | { | - | ||||||||||||||||||
| 271 | if (sshbuf_check_sanity(buf) != 0)
| 0-11919937 | ||||||||||||||||||
| 272 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||
| 273 | return buf->cd + buf->off; executed 11919937 times by 6 tests: return buf->cd + buf->off;Executed by:
| 11919937 | ||||||||||||||||||
| 274 | } | - | ||||||||||||||||||
| 275 | - | |||||||||||||||||||
| 276 | u_char * | - | ||||||||||||||||||
| 277 | sshbuf_mutable_ptr(const struct sshbuf *buf) | - | ||||||||||||||||||
| 278 | { | - | ||||||||||||||||||
| 279 | if (sshbuf_check_sanity(buf) != 0 || buf->readonly || buf->refcount > 1)
| 0-1386 | ||||||||||||||||||
| 280 | return NULL; executed 3 times by 1 test: return ((void *)0) ;Executed by:
| 3 | ||||||||||||||||||
| 281 | return buf->d + buf->off; executed 1383 times by 4 tests: return buf->d + buf->off;Executed by:
| 1383 | ||||||||||||||||||
| 282 | } | - | ||||||||||||||||||
| 283 | - | |||||||||||||||||||
| 284 | int | - | ||||||||||||||||||
| 285 | sshbuf_check_reserve(const struct sshbuf *buf, size_t len) | - | ||||||||||||||||||
| 286 | { | - | ||||||||||||||||||
| 287 | int r; | - | ||||||||||||||||||
| 288 | - | |||||||||||||||||||
| 289 | if ((r = sshbuf_check_sanity(buf)) != 0)
| 0-10164853 | ||||||||||||||||||
| 290 | return r; never executed: return r; | 0 | ||||||||||||||||||
| 291 | if (buf->readonly || buf->refcount > 1)
| 0-10164850 | ||||||||||||||||||
| 292 | return SSH_ERR_BUFFER_READ_ONLY; executed 3 times by 1 test: return -49;Executed by:
| 3 | ||||||||||||||||||
| 293 | SSHBUF_TELL("check"); | - | ||||||||||||||||||
| 294 | /* Check that len is reasonable and that max_size + available < len */ | - | ||||||||||||||||||
| 295 | if (len > buf->max_size || buf->max_size - len < buf->size - buf->off)
| 19512-10135545 | ||||||||||||||||||
| 296 | return SSH_ERR_NO_BUFFER_SPACE; executed 48817 times by 1 test: return -9;Executed by:
| 48817 | ||||||||||||||||||
| 297 | return 0; executed 10116033 times by 6 tests: return 0;Executed by:
| 10116033 | ||||||||||||||||||
| 298 | } | - | ||||||||||||||||||
| 299 | - | |||||||||||||||||||
| 300 | int | - | ||||||||||||||||||
| 301 | sshbuf_allocate(struct sshbuf *buf, size_t len) | - | ||||||||||||||||||
| 302 | { | - | ||||||||||||||||||
| 303 | size_t rlen, need; | - | ||||||||||||||||||
| 304 | u_char *dp; | - | ||||||||||||||||||
| 305 | int r; | - | ||||||||||||||||||
| 306 | - | |||||||||||||||||||
| 307 | SSHBUF_DBG(("allocate buf = %p len = %zu", buf, len)); | - | ||||||||||||||||||
| 308 | if ((r = sshbuf_check_reserve(buf, len)) != 0)
| 48819-9833031 | ||||||||||||||||||
| 309 | return r; executed 48819 times by 1 test: return r;Executed by:
| 48819 | ||||||||||||||||||
| 310 | /* | - | ||||||||||||||||||
| 311 | * If the requested allocation appended would push us past max_size | - | ||||||||||||||||||
| 312 | * then pack the buffer, zeroing buf->off. | - | ||||||||||||||||||
| 313 | */ | - | ||||||||||||||||||
| 314 | sshbuf_maybe_pack(buf, buf->size + len > buf->max_size); | - | ||||||||||||||||||
| 315 | SSHBUF_TELL("allocate"); | - | ||||||||||||||||||
| 316 | if (len + buf->size <= buf->alloc)
| 283002-9550029 | ||||||||||||||||||
| 317 | return 0; /* already have it. */ executed 9550029 times by 6 tests: return 0;Executed by:
| 9550029 | ||||||||||||||||||
| 318 | - | |||||||||||||||||||
| 319 | /* | - | ||||||||||||||||||
| 320 | * Prefer to alloc in SSHBUF_SIZE_INC units, but | - | ||||||||||||||||||
| 321 | * allocate less if doing so would overflow max_size. | - | ||||||||||||||||||
| 322 | */ | - | ||||||||||||||||||
| 323 | need = len + buf->size - buf->alloc; | - | ||||||||||||||||||
| 324 | rlen = ROUNDUP(buf->alloc + need, SSHBUF_SIZE_INC); | - | ||||||||||||||||||
| 325 | SSHBUF_DBG(("need %zu initial rlen %zu", need, rlen)); | - | ||||||||||||||||||
| 326 | if (rlen > buf->max_size)
| 1385-281617 | ||||||||||||||||||
| 327 | rlen = buf->alloc + need; executed 1385 times by 1 test: rlen = buf->alloc + need;Executed by:
| 1385 | ||||||||||||||||||
| 328 | SSHBUF_DBG(("adjusted rlen %zu", rlen)); | - | ||||||||||||||||||
| 329 | if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL) {
| 0-283002 | ||||||||||||||||||
| 330 | SSHBUF_DBG(("realloc fail")); | - | ||||||||||||||||||
| 331 | return SSH_ERR_ALLOC_FAIL; never executed: return -2; | 0 | ||||||||||||||||||
| 332 | } | - | ||||||||||||||||||
| 333 | buf->alloc = rlen; | - | ||||||||||||||||||
| 334 | buf->cd = buf->d = dp; | - | ||||||||||||||||||
| 335 | if ((r = sshbuf_check_reserve(buf, len)) < 0) {
| 0-283002 | ||||||||||||||||||
| 336 | /* shouldn't fail */ | - | ||||||||||||||||||
| 337 | return r; never executed: return r; | 0 | ||||||||||||||||||
| 338 | } | - | ||||||||||||||||||
| 339 | SSHBUF_TELL("done"); | - | ||||||||||||||||||
| 340 | return 0; executed 283002 times by 6 tests: return 0;Executed by:
| 283002 | ||||||||||||||||||
| 341 | } | - | ||||||||||||||||||
| 342 | - | |||||||||||||||||||
| 343 | int | - | ||||||||||||||||||
| 344 | sshbuf_reserve(struct sshbuf *buf, size_t len, u_char **dpp) | - | ||||||||||||||||||
| 345 | { | - | ||||||||||||||||||
| 346 | u_char *dp; | - | ||||||||||||||||||
| 347 | int r; | - | ||||||||||||||||||
| 348 | - | |||||||||||||||||||
| 349 | if (dpp != NULL)
| 4-9881846 | ||||||||||||||||||
| 350 | *dpp = NULL; executed 9881846 times by 6 tests: *dpp = ((void *)0) ;Executed by:
| 9881846 | ||||||||||||||||||
| 351 | - | |||||||||||||||||||
| 352 | SSHBUF_DBG(("reserve buf = %p len = %zu", buf, len)); | - | ||||||||||||||||||
| 353 | if ((r = sshbuf_allocate(buf, len)) != 0)
| 48819-9833031 | ||||||||||||||||||
| 354 | return r; executed 48819 times by 1 test: return r;Executed by:
| 48819 | ||||||||||||||||||
| 355 | - | |||||||||||||||||||
| 356 | dp = buf->d + buf->size; | - | ||||||||||||||||||
| 357 | buf->size += len; | - | ||||||||||||||||||
| 358 | if (dpp != NULL)
| 3-9833028 | ||||||||||||||||||
| 359 | *dpp = dp; executed 9833028 times by 6 tests: *dpp = dp;Executed by:
| 9833028 | ||||||||||||||||||
| 360 | return 0; executed 9833031 times by 6 tests: return 0;Executed by:
| 9833031 | ||||||||||||||||||
| 361 | } | - | ||||||||||||||||||
| 362 | - | |||||||||||||||||||
| 363 | int | - | ||||||||||||||||||
| 364 | sshbuf_consume(struct sshbuf *buf, size_t len) | - | ||||||||||||||||||
| 365 | { | - | ||||||||||||||||||
| 366 | int r; | - | ||||||||||||||||||
| 367 | - | |||||||||||||||||||
| 368 | SSHBUF_DBG(("len = %zu", len)); | - | ||||||||||||||||||
| 369 | if ((r = sshbuf_check_sanity(buf)) != 0)
| 0-7081632 | ||||||||||||||||||
| 370 | return r; never executed: return r; | 0 | ||||||||||||||||||
| 371 | if (len == 0)
| 1295-7080337 | ||||||||||||||||||
| 372 | return 0; executed 1295 times by 2 tests: return 0;Executed by:
| 1295 | ||||||||||||||||||
| 373 | if (len > sshbuf_len(buf))
| 7059-7073278 | ||||||||||||||||||
| 374 | return SSH_ERR_MESSAGE_INCOMPLETE; executed 7059 times by 2 tests: return -3;Executed by:
| 7059 | ||||||||||||||||||
| 375 | buf->off += len; | - | ||||||||||||||||||
| 376 | /* deal with empty buffer */ | - | ||||||||||||||||||
| 377 | if (buf->off == buf->size)
| 167940-6905338 | ||||||||||||||||||
| 378 | buf->off = buf->size = 0; executed 167940 times by 6 tests: buf->off = buf->size = 0;Executed by:
| 167940 | ||||||||||||||||||
| 379 | SSHBUF_TELL("done"); | - | ||||||||||||||||||
| 380 | return 0; executed 7073278 times by 6 tests: return 0;Executed by:
| 7073278 | ||||||||||||||||||
| 381 | } | - | ||||||||||||||||||
| 382 | - | |||||||||||||||||||
| 383 | int | - | ||||||||||||||||||
| 384 | sshbuf_consume_end(struct sshbuf *buf, size_t len) | - | ||||||||||||||||||
| 385 | { | - | ||||||||||||||||||
| 386 | int r; | - | ||||||||||||||||||
| 387 | - | |||||||||||||||||||
| 388 | SSHBUF_DBG(("len = %zu", len)); | - | ||||||||||||||||||
| 389 | if ((r = sshbuf_check_sanity(buf)) != 0)
| 0-66307 | ||||||||||||||||||
| 390 | return r; never executed: return r; | 0 | ||||||||||||||||||
| 391 | if (len == 0)
| 1335-64972 | ||||||||||||||||||
| 392 | return 0; executed 1335 times by 1 test: return 0;Executed by:
| 1335 | ||||||||||||||||||
| 393 | if (len > sshbuf_len(buf))
| 7040-57932 | ||||||||||||||||||
| 394 | return SSH_ERR_MESSAGE_INCOMPLETE; executed 7040 times by 1 test: return -3;Executed by:
| 7040 | ||||||||||||||||||
| 395 | buf->size -= len; | - | ||||||||||||||||||
| 396 | SSHBUF_TELL("done"); | - | ||||||||||||||||||
| 397 | return 0; executed 57932 times by 4 tests: return 0;Executed by:
| 57932 | ||||||||||||||||||
| 398 | } | - | ||||||||||||||||||
| 399 | - | |||||||||||||||||||
| Source code | Switch to Preprocessed file |