From: Andrew Cagney <ac131313@redhat.com>
To: gdb-patches@sources.redhat.com
Subject: [patch / rfc / 5.3] Attempt N++ for gdb_realpath()
Date: Mon, 11 Nov 2002 08:48:00 -0000 [thread overview]
Message-ID: <3DCFDF46.7000900@redhat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 476 bytes --]
Hello,
This is trying to fix
http://sources.redhat.com/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gdb&pr=656
It breaks the host system down into:
- realpath() and constant pathmax
- canonicalize file name
- realpath() and pathconf()
- xstrdup()
realpath() is split into two cases - the easy / common one and the nasty
horrible pathconf() one. The latter (which was causing grief on GNU)
has been moved to the end.
comments? For 5.3 and mainline.
Andrew
[-- Attachment #2: diffs --]
[-- Type: text/plain, Size: 3497 bytes --]
2002-11-09 Andrew Cagney <ac131313@redhat.com>
* utils.c (gdb_realpath): Rewrite. Try realpath() with a constant
buffer, cannonicalize_file_name(), realpath() with a pathconf()
defined buffer, xstrdup().
Index: utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.76
diff -p -r1.76 utils.c
*** utils.c 1 Aug 2002 17:18:33 -0000 1.76
--- utils.c 11 Nov 2002 16:33:36 -0000
*************** string_to_core_addr (const char *my_stri
*** 2534,2564 ****
char *
gdb_realpath (const char *filename)
{
#if defined(HAVE_REALPATH)
# if defined (PATH_MAX)
! char buf[PATH_MAX];
# define USE_REALPATH
# elif defined (MAXPATHLEN)
! char buf[MAXPATHLEN];
! # define USE_REALPATH
! # elif defined (HAVE_UNISTD_H) && defined(HAVE_ALLOCA)
! char *buf = alloca ((size_t)pathconf ("/", _PC_PATH_MAX));
# define USE_REALPATH
# endif
#endif /* HAVE_REALPATH */
! #if defined(USE_REALPATH)
! char *rp = realpath (filename, buf);
! return xstrdup (rp ? rp : filename);
! #elif defined(HAVE_CANONICALIZE_FILE_NAME)
! char *rp = canonicalize_file_name (filename);
! if (rp == NULL)
! return xstrdup (filename);
! else
! return rp;
! #else
! return xstrdup (filename);
#endif
}
/* Return a copy of FILENAME, with its directory prefix canonicalized
--- 2534,2597 ----
char *
gdb_realpath (const char *filename)
{
+ /* Method 1: The system has a compile time upper bound on a filename
+ path. Use that and realpath() to canonicalize the name. This is
+ the most common case. Note that, if there isn't a compile time
+ upper bound, you want to avoid realpath() at all costs. */
#if defined(HAVE_REALPATH)
+ {
# if defined (PATH_MAX)
! char buf[PATH_MAX];
# define USE_REALPATH
# elif defined (MAXPATHLEN)
! char buf[MAXPATHLEN];
# define USE_REALPATH
# endif
+ # if defined (USE_REALPATH)
+ char *rp = realpath (filename, buf);
+ if (rp == NULL)
+ rp = filename;
+ return xstrdup (rp);
+ }
+ # endif
#endif /* HAVE_REALPATH */
! /* Method 2: The host system (i.e., GNU) has the function
! canonicalize_file_name() which malloc's a chunk of memory and
! returns that, use that. */
! #if defined(HAVE_CANONICALIZE_FILE_NAME)
! {
! char *rp = canonicalize_file_name (filename);
! if (rp == NULL)
! return xstrdup (filename);
! else
! return rp;
! }
#endif
+
+ /* Method 3: Now we're getting desperate! The system doesn't have a
+ compile time buffer size and no alternative function. Query the
+ OS, using pathconf(), for the buffer limit. Care is needed
+ though, some systems do not limit PATH_MAX (return -1 for
+ pathconf()) making it impossible to pass a correctly sized buffer
+ to realpath() (it could always overflow). On those systems, we
+ skip this. */
+ #if defined (HAVE_REALPATH) && defined (HAVE_UNISTD_H) && defined(HAVE_ALLOCA)
+ {
+ /* Find out the max path size. */
+ long path_max = pathconf ("/", _PC_PATH_MAX);
+ if (path_max > 0)
+ {
+ /* PATH_MAX is bounded. */
+ char *buf = alloca (path_max);
+ char *rp = realpath (filename, buf);
+ return xstrdup (rp ? rp : filename);
+ }
+ }
+ #endif
+
+ /* This system is a lost cause, just dup the buffer. */
+ return xstrdup (filename);
}
/* Return a copy of FILENAME, with its directory prefix canonicalized
next reply other threads:[~2002-11-11 16:48 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-11-11 8:48 Andrew Cagney [this message]
2002-11-12 9:20 ` Andrew Cagney
2002-11-12 12:28 ` Andrew Cagney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3DCFDF46.7000900@redhat.com \
--to=ac131313@redhat.com \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox