bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-gnulib] xreadlink.c patch


From: Paul Eggert
Subject: Re: [Bug-gnulib] xreadlink.c patch
Date: Wed, 03 Nov 2004 01:24:08 -0800
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

"Mark D. Baushke" <address@hidden> writes:

> It would seem more optimal to put the fix into xmalloc()

I assume you mean "xreadlink()" here?

> because it is already adjusting the size of the buffer it is
> creating... otherwise, why is xreadlink() not just doing the stat in
> the first place itself?

Because xreadlink is typically called from places that have already
done the stat.  In coreutils, only one xreadlink call guesses the
size; the rest already know it.

I'm not particularly worried about optimizing the case for broken
readlink implementations.  They can do a stat twice.

>> xsize.h is somewhat controversial, due to its treatment of overflow.
>> I'd rather avoid it if it's easy (which is the case here).
>
> Hmmm... are those guidelines written anywhere in the documentation yet?

Sorry, no.  ("Documentation?"  :-)

But after looking at it again, I agree with you that it's less hassle
for now just to munge xreadlink.  I installed this:

2004-11-03  Paul Eggert  <address@hidden>

        * xreadlink.c (xreadlink): AIX and HP-UX readlink return -1
        with errno == ERANGE if the buffer is too small.
        Problem reported by Mark D. Baushke.

Index: xreadlink.c
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/xreadlink.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -p -u -r1.16 -r1.17
--- xreadlink.c 2 Nov 2004 20:17:37 -0000       1.16
+++ xreadlink.c 3 Nov 2004 09:24:17 -0000       1.17
@@ -66,7 +66,9 @@ xreadlink (char const *filename, size_t 
       ssize_t r = readlink (filename, buffer, buf_size);
       size_t link_length = r;
 
-      if (r < 0)
+      /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+        with errno == ERANGE if the buffer is too small.  */
+      if (r < 0 && errno != ERANGE)
        {
          int saved_errno = errno;
          free (buffer);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]