X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=lib%2Fsh%2Fzgetline.c;h=33ac830da6d1b1f7f7fcb5869370150c807c809a;hb=17345e5ad288f7543b77b23a25aa380eacc279f2;hp=20069e901d1bf6f36863d2698383a10baad41e09;hpb=3185942a5234e26ab13fa02f9c51d340cec514f8;p=platform%2Fupstream%2Fbash.git diff --git a/lib/sh/zgetline.c b/lib/sh/zgetline.c index 20069e9..33ac830 100644 --- a/lib/sh/zgetline.c +++ b/lib/sh/zgetline.c @@ -36,6 +36,11 @@ extern int errno; extern ssize_t zread __P((int, char *, size_t)); extern ssize_t zreadc __P((int, char *)); +extern ssize_t zreadintr __P((int, char *, size_t)); +extern ssize_t zreadcintr __P((int, char *)); + +typedef ssize_t breadfunc_t __P((int, char *, size_t)); +typedef ssize_t creadfunc_t __P((int, char *)); /* Initial memory allocation for automatic growing buffer in zreadlinec */ #define GET_LINE_INITIAL_ALLOCATION 16 @@ -74,31 +79,32 @@ zgetline (fd, lineptr, n, unbuffered_read) if (retval <= 0) { - line[nr] = '\0'; + if (line && nr > 0) + line[nr] = '\0'; break; } if (nr + 2 >= *n) { - size_t new_size; - - new_size = (*n == 0) ? GET_LINE_INITIAL_ALLOCATION : *n * 2; - line = xrealloc (*lineptr, new_size); - - if (line) - { - *lineptr = line; - *n = new_size; - } - else - { - if (*n > 0) - { - (*lineptr)[*n - 1] = '\0'; - nr = *n - 2; - } - break; - } + size_t new_size; + + new_size = (*n == 0) ? GET_LINE_INITIAL_ALLOCATION : *n * 2; + line = (*n >= new_size) ? NULL : xrealloc (*lineptr, new_size); + + if (line) + { + *lineptr = line; + *n = new_size; + } + else + { + if (*n > 0) + { + (*lineptr)[*n - 1] = '\0'; + nr = *n - 2; + } + break; + } } line[nr] = c;