aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crypto/compat/getdelim.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/crypto/compat/getdelim.c b/crypto/compat/getdelim.c
index caec3f2..9bacf0c 100644
--- a/crypto/compat/getdelim.c
+++ b/crypto/compat/getdelim.c
@@ -35,13 +35,16 @@
35ssize_t 35ssize_t
36getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) 36getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
37{ 37{
38 char *ptr, *eptr; 38 char *ptr, *eptr, *nbuf;
39 size_t nbufsiz;
39 40
40 41
41 if (*buf == NULL || *bufsiz == 0) { 42 if (*buf == NULL || *bufsiz < 2) {
42 *bufsiz = BUFSIZ; 43 nbufsiz = BUFSIZ;
43 if ((*buf = malloc(*bufsiz)) == NULL) 44 if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
44 return -1; 45 return -1;
46 *buf = nbuf;
47 *bufsiz = nbufsiz;
45 } 48 }
46 49
47 for (ptr = *buf, eptr = *buf + *bufsiz;;) { 50 for (ptr = *buf, eptr = *buf + *bufsiz;;) {
@@ -62,9 +65,8 @@ getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
62 return ptr - *buf; 65 return ptr - *buf;
63 } 66 }
64 if (ptr + 2 >= eptr) { 67 if (ptr + 2 >= eptr) {
65 char *nbuf;
66 size_t nbufsiz = *bufsiz * 2;
67 ssize_t d = ptr - *buf; 68 ssize_t d = ptr - *buf;
69 nbufsiz = *bufsiz * 2;
68 if ((nbuf = realloc(*buf, nbufsiz)) == NULL) 70 if ((nbuf = realloc(*buf, nbufsiz)) == NULL)
69 return -1; 71 return -1;
70 *buf = nbuf; 72 *buf = nbuf;