projects
/
gnulib.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* lib/strptime.h (strptime): Use 'restrict' for args where
[gnulib.git]
/
lib
/
getdelim.c
diff --git
a/lib/getdelim.c
b/lib/getdelim.c
index
5dc4a38
..
e0b8a70
100644
(file)
--- a/
lib/getdelim.c
+++ b/
lib/getdelim.c
@@
-1,5
+1,5
@@
/* getdelim.c --- Implementation of replacement getdelim function.
/* getdelim.c --- Implementation of replacement getdelim function.
- Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005 Free
+ Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005
, 2006
Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or
Software Foundation, Inc.
This program is free software; you can redistribute it and/or
@@
-19,15
+19,20
@@
/* Ported from glibc by Simon Josefsson. */
/* Ported from glibc by Simon Josefsson. */
-#i
f HAVE_CONFIG_H
-# include <config.h>
-#
endif
+#i
nclude <config.h>
+
+#
include "getdelim.h"
+#include <limits.h>
#include <stdlib.h>
#include <errno.h>
#include <stdlib.h>
#include <errno.h>
-#include "getdelim.h"
-
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
#if !HAVE_FLOCKFILE
# undef flockfile
# define flockfile(x) ((void) 0)
#if !HAVE_FLOCKFILE
# undef flockfile
# define flockfile(x) ((void) 0)
@@
-46,9
+51,8
@@
ssize_t
getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
{
ssize_t
getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
{
- int result = 0;
- ssize_t cur_len = 0;
- ssize_t len;
+ ssize_t result;
+ size_t cur_len = 0;
if (lineptr == NULL || n == NULL || fp == NULL)
{
if (lineptr == NULL || n == NULL || fp == NULL)
{
@@
-71,23
+75,26
@@
getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
for (;;)
{
for (;;)
{
- char *t;
int i;
i = getc (fp);
if (i == EOF)
int i;
i = getc (fp);
if (i == EOF)
- {
- result = -1;
- break;
- }
+
{
+
result = -1;
+
break;
+
}
/* Make enough space for len+1 (for final NUL) bytes. */
if (cur_len + 1 >= *n)
{
/* Make enough space for len+1 (for final NUL) bytes. */
if (cur_len + 1 >= *n)
{
- size_t needed = 2 * (cur_len + 1) + 1; /* Be generous. */
+ size_t needed_max =
+ SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
+ size_t needed = 2 * *n + 1; /* Be generous. */
char *new_lineptr;
char *new_lineptr;
- if (needed < cur_len)
+ if (needed_max < needed)
+ needed = needed_max;
+ if (cur_len + 1 >= needed)
{
result = -1;
goto unlock_return;
{
result = -1;
goto unlock_return;