version 1.11, 2017/06/01 06:58:25 |
version 1.12, 2018/07/09 21:56:06 |
|
|
(!buf->readonly && buf->d != buf->cd) || |
(!buf->readonly && buf->d != buf->cd) || |
buf->refcount < 1 || buf->refcount > SSHBUF_REFS_MAX || |
buf->refcount < 1 || buf->refcount > SSHBUF_REFS_MAX || |
buf->cd == NULL || |
buf->cd == NULL || |
(buf->dont_free && (buf->readonly || buf->parent != NULL)) || |
|
buf->max_size > SSHBUF_SIZE_MAX || |
buf->max_size > SSHBUF_SIZE_MAX || |
buf->alloc > buf->max_size || |
buf->alloc > buf->max_size || |
buf->size > buf->alloc || |
buf->size > buf->alloc || |
|
|
} |
} |
|
|
void |
void |
sshbuf_init(struct sshbuf *ret) |
|
{ |
|
explicit_bzero(ret, sizeof(*ret)); |
|
ret->alloc = SSHBUF_SIZE_INIT; |
|
ret->max_size = SSHBUF_SIZE_MAX; |
|
ret->readonly = 0; |
|
ret->dont_free = 1; |
|
ret->refcount = 1; |
|
if ((ret->cd = ret->d = calloc(1, ret->alloc)) == NULL) |
|
ret->alloc = 0; |
|
} |
|
|
|
void |
|
sshbuf_free(struct sshbuf *buf) |
sshbuf_free(struct sshbuf *buf) |
{ |
{ |
int dont_free = 0; |
|
|
|
if (buf == NULL) |
if (buf == NULL) |
return; |
return; |
/* |
/* |
|
|
buf->refcount--; |
buf->refcount--; |
if (buf->refcount > 0) |
if (buf->refcount > 0) |
return; |
return; |
dont_free = buf->dont_free; |
|
if (!buf->readonly) { |
if (!buf->readonly) { |
explicit_bzero(buf->d, buf->alloc); |
explicit_bzero(buf->d, buf->alloc); |
free(buf->d); |
free(buf->d); |
} |
} |
explicit_bzero(buf, sizeof(*buf)); |
explicit_bzero(buf, sizeof(*buf)); |
if (!dont_free) |
free(buf); |
free(buf); |
|
} |
} |
|
|
void |
void |