about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--elf/dl-dst.h43
2 files changed, 30 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index bc0b18a60c..614445d16e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-12-31  Ulrich Drepper  <drepper@redhat.com>
+
+	* elf/dl-dst.h (DL_DST_REQUIRED): Avoid the complex operations if
+	CNT == 0.
+
 2003-12-30  Jakub Jelinek  <jakub@redhat.com>
 
 	* posix/regexec.c (get_subexp): Only set bkref_str after the first
diff --git a/elf/dl-dst.h b/elf/dl-dst.h
index dc11e360af..4f0669d92b 100644
--- a/elf/dl-dst.h
+++ b/elf/dl-dst.h
@@ -1,5 +1,5 @@
 /* Handling of dynamic sring tokens.
-   Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -37,28 +37,35 @@ extern size_t _dl_dst_count_internal (const char *name, int is_path);
 /* Guess from the number of DSTs the length of the result string.  */
 #define DL_DST_REQUIRED(l, name, len, cnt) \
   ({									      \
-    size_t origin_len;							      \
     size_t __len = (len);						      \
+    size_t __cnt = (cnt);						      \
 									      \
-    /* Now we make a guess how many extra characters on top of the length     \
-       of S we need to represent the result.  We know that we have CNT	      \
-       replacements.  Each at most can use				      \
-         MAX (strlen (ORIGIN), strlen (_dl_platform))			      \
-       minus 7 (which is the length of "$ORIGIN").			      \
-									      \
-       First get the origin string if it is not available yet.  This can      \
-       only happen for the map of the executable.  */			      \
-    if ((l)->l_origin == NULL)						      \
+    if (__cnt > 0)							      \
       {									      \
-	assert ((l)->l_name[0] == '\0');				      \
-	(l)->l_origin = _dl_get_origin ();				      \
-	origin_len = ((l)->l_origin && (l)->l_origin != (char *) -1	      \
-		      ? strlen ((l)->l_origin) : 0);			      \
+	size_t origin_len;						      \
+	/* Now we make a guess how many extra characters on top of the	      \
+	   length of S we need to represent the result.  We know that	      \
+	   we have CNT replacements.  Each at most can use		      \
+	     MAX (strlen (ORIGIN), strlen (_dl_platform))		      \
+	   minus 7 (which is the length of "$ORIGIN").			      \
+									      \
+	   First get the origin string if it is not available yet.	      \
+	   This can only happen for the map of the executable.  */	      \
+	if ((l)->l_origin == NULL)					      \
+	  {								      \
+	    assert ((l)->l_name[0] == '\0');				      \
+	    (l)->l_origin = _dl_get_origin ();				      \
+	    origin_len = ((l)->l_origin && (l)->l_origin != (char *) -1	      \
+			  ? strlen ((l)->l_origin) : 0);		      \
+	  }								      \
+	else								      \
+	  origin_len = (l)->l_origin == (char *) -1			      \
+	    ? 0 : strlen ((l)->l_origin);				      \
+									      \
+	__len += __cnt * (MAX (origin_len, GL(dl_platformlen)) - 7);	      \
       }									      \
-    else								      \
-      origin_len = (l)->l_origin == (char *) -1 ? 0 : strlen ((l)->l_origin); \
 									      \
-    __len + cnt * (MAX (origin_len, GL(dl_platformlen)) - 7); })
+    __len; })
 
 /* Find origin of the executable.  */
 extern const char *_dl_get_origin (void);