commit - 31753df0dc604c687f7fd962522b9032b1f354fc
commit + 201077757b14041ebdf1946de3982f57b06652b0
blob - e4e8a8cad0f95bcae2845f9672e6b231cbcbd851
blob + ade9c602f3c464de381fafd846a050bb67e1e8b7
--- parser.c
+++ parser.c
int
parser_set_buf(struct parser *p, const char *buf, size_t len)
{
- free(p->buf);
- p->buf = NULL;
+ char *tmp;
if (len == 0) {
p->len = 0;
+ free(p->buf);
+ p->buf = NULL;
return 1;
}
- if ((p->buf = calloc(1, len)) == NULL)
+ /* p->buf and buf can (and probably almost always will)
+ * overlap! */
+
+ if ((tmp = calloc(1, len)) == NULL)
return 0;
- memcpy(p->buf, buf, len);
+ memcpy(tmp, buf, len);
+ free(p->buf);
+ p->buf = tmp;
p->len = len;
return 1;
}
-