X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=util.c;h=3d119874eb1c11c7d7b9e367a6bf1a2bef6c4b4b;hp=fff5b6d13e5e0f74544723ea4ff9e8f9013634f5;hb=5ad34db2ccbbfbc936cd16121bed2110b70594ba;hpb=1caa23ff879cec7f8f36b32a987f0610291ef177 diff --git a/util.c b/util.c index fff5b6d..3d11987 100644 --- a/util.c +++ b/util.c @@ -166,6 +166,7 @@ static const char *phases[NR_PHASES]={ "PHASE_GETOPTS", "PHASE_READCONFIG", "PHASE_SETUP", + "PHASE_DAEMONIZE", "PHASE_GETRESOURCES", "PHASE_DROPPRIV", "PHASE_RUN", @@ -227,8 +228,9 @@ void buffer_assert_free(struct buffer_if *buffer, cstring_t file, int line) { if (!buffer->free) { - fatal("BUF_ASSERT_FREE, %s line %d, owned by %s", - file,line,buffer->owner); + fprintf(stderr,"secnet: BUF_ASSERT_FREE, %s line %d, owned by %s", + file,line,buffer->owner); + assert(!"buffer_assert_free failure"); } } @@ -236,8 +238,9 @@ void buffer_assert_used(struct buffer_if *buffer, cstring_t file, int line) { if (buffer->free) { - fatal("BUF_ASSERT_USED, %s line %d, last owned by %s", - file,line,buffer->owner); + fprintf(stderr,"secnet: BUF_ASSERT_USED, %s line %d, last owned by %s", + file,line,buffer->owner); + assert(!"buffer_assert_used failure"); } } @@ -268,6 +271,7 @@ void *buf_unappend(struct buffer_if *buf, int32_t amount) { void *buf_unprepend(struct buffer_if *buf, int32_t amount) { void *p; + if (buf->size < amount) return 0; p=buf->start; buf->start+=amount; buf->size-=amount; @@ -299,6 +303,34 @@ void buffer_new(struct buffer_if *buf, int32_t len) buf->base=safe_malloc(len,"buffer_new"); } +void buffer_readonly_view(struct buffer_if *buf, const void *data, int32_t len) +{ + buf->free=False; + buf->owner="READONLY"; + buf->flags=0; + buf->loc.file=NULL; + buf->loc.line=0; + buf->size=buf->len=len; + buf->base=buf->start=(uint8_t*)data; +} + +void buffer_readonly_clone(struct buffer_if *out, const struct buffer_if *in) +{ + buffer_readonly_view(out,in->start,in->size); +} + +void buffer_copy(struct buffer_if *dst, const struct buffer_if *src) +{ + if (dst->len < src->len) { + dst->base=realloc(dst->base,src->len); + if (!dst->base) fatal_perror("buffer_copy"); + dst->len = src->len; + } + dst->start = dst->base + (src->start - src->base); + dst->size = src->size; + memcpy(dst->start, src->start, dst->size); +} + static list_t *buffer_apply(closure_t *self, struct cloc loc, dict_t *context, list_t *args) { @@ -349,6 +381,22 @@ static list_t *buffer_apply(closure_t *self, struct cloc loc, dict_t *context, return new_closure(&st->cl); } +int consttime_memeq(const void *s1in, const void *s2in, size_t n) +{ + const uint8_t *s1=s1in, *s2=s2in; + register volatile uint8_t accumulator=0; + + while (n-- > 0) { + accumulator |= (*s1++ ^ *s2++); + } + accumulator |= accumulator >> 4; /* constant-time */ + accumulator |= accumulator >> 2; /* boolean canonicalisation */ + accumulator |= accumulator >> 1; + accumulator &= 1; + accumulator ^= 1; + return accumulator; +} + void util_module(dict_t *dict) { add_closure(dict,"sysbuffer",buffer_apply);