static inline int chunk_initlen(struct chunk *chk, char *str, size_t size, int len)
{
- if (size && len > size)
+ if (len < 0 || (size && len > size))
return 0;
chk->str = str;
len = strlen(str);
- if (unlikely(chk->len + len >= chk->size))
+ if (unlikely(chk->len < 0 || chk->len + len >= chk->size))
return 0;
memcpy(chk->str + chk->len, str, len + 1);
*/
static inline char *chunk_newstr(struct chunk *chk)
{
- if (chk->len + 1 >= chk->size)
+ if (chk->len < 0 || chk->len + 1 >= chk->size)
return NULL;
chk->str[chk->len++] = 0;
*/
static inline char *chunk_dup(struct chunk *dst, const struct chunk *src)
{
- if (!dst || !src || !src->str)
+ if (!dst || !src || src->len < 0 || !src->str)
return NULL;
if (dst->size)
if (len == 0)
return -1;
- if (len > chn->buf->size) {
+ if (len < 0 || len > chn->buf->size) {
/* we can't write this chunk and will never be able to, because
* it is larger than the buffer. This must be reported as an
* error. Then we return -2 so that writers that don't care can
if (unlikely(channel_input_closed(chn)))
return -2;
+ if (len < 0)
+ return -3;
+
max = channel_recv_limit(chn);
if (unlikely(len > max - buffer_len(chn->buf))) {
/* we can't write this chunk right now because the buffer is
va_list argp;
int ret;
- if (!chk->str || !chk->size)
+ if (chk->len < 0 || !chk->str || !chk->size)
return 0;
va_start(argp, fmt);
int olen, free;
char c;
+ if (dst->len < 0)
+ return dst->len;
+
olen = dst->len;
for (i = 0; i < src->len; i++) {
int olen, free;
char c;
+ if (dst->len < 0)
+ return dst->len;
+
olen = dst->len;
for (i = 0; i < src->len; i++) {