goto err;
memcpy(name->name, buf+1, len);
name->flags = unpack_32_le(buf+len+1);
+ len += 4;
- nbuf -= len + 5;
- memmove(buf, buf+len+5, nbuf);
+ nbuf -= len + 1;
+ memmove(buf, buf+len+1, nbuf);
index++;
} else {
- /* TODO */
- abort();
+ char *c = memchr(buf, 0, nbuf);
+ if (!c || nbuf <= c - buf + 5)
+ goto err;
+ len = c - buf + 1;
+ name->name = malloc(len);
+ if (!name->name)
+ goto err;
+ memcpy(name->name, buf, len);
+ name->flags = unpack_32_le(buf+len);
+ len += 4;
+
+ nbuf -= len;
+ memmove(buf, buf+len, nbuf);
+ index++;
}
}