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");
}
}
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");
}
}
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)
{
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);