about summary refs log tree commit diff
path: root/stdlib
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-11-06 00:02:46 +0000
committerUlrich Drepper <drepper@redhat.com>1997-11-06 00:02:46 +0000
commit86187531d302de284b67ac162cf76c60c86bd7da (patch)
tree456f8b37f8e8fa67c16ee0cf6de7b591d9d3d913 /stdlib
parent1618c590382ef16b1942bf39a42aa683a050ff57 (diff)
downloadglibc-86187531d302de284b67ac162cf76c60c86bd7da.tar.gz
glibc-86187531d302de284b67ac162cf76c60c86bd7da.tar.xz
glibc-86187531d302de284b67ac162cf76c60c86bd7da.zip
1997-11-06 00:06  Ulrich Drepper  <drepper@cygnus.com>

	* argp/argp-help.c: Optimize a bit by using mempcpy.
	* elf/dl-load.c: Likewise.
	* elf/dl-lookup.c: Likewise.
	* inet/rcmd.c: Likewise.
	* io/ftw.c: Likewise.
	* libio/fileops.c: Likewise.
	* libio/genops.c: Likewise.
	* libio/obprintf.c: Likewise.
	* nss/nsswitch.c: Likewise.
	* posix/execvp.c: Likewise.
	* posix/getopt.c: Likewise.
	* posix/glob.c: Likewise.
	* posix/wordexp.c: Likewise.
	* stdio-common/vfprintf.c: Likewise.
	* stdlib/canonicalize.c: Likewise.
	* stdlib/msort.c: Likewise.
	* string/argz-replace.c: Likewise.
	* sysdeps/generic/putenv.c: Likewise.
	* sysdeps/generic/setenv.c: Likewise.
	* sysdeps/posix/getcwd.c: Likewise.
	* sysdeps/posix/ttyname.c: Likewise.
	* sysdeps/posix/writev.c: Likewise.
	* time/strftime.c: Likewise.
	* time/tzfile.c: Likewise.

	* login/utmp_daemon.c: Use memcpy instead of strcpy where possible.
	* sunrpc/svcauth_des.c: Likewise.
	* sysdeps/unix/sysv/linux/gethostname.c: Likewise.

	* misc/tsearch.c: Use memcpy return value if possible.
	* posix/regex.c: Likewise.
	* sysdeps/unix/readdir_r.c: Likewise.
	* wcsmbc/wcsdup.c: Likewise.

	* nss/digits_dots.c: Little optimization.

	* inet/ruserpass.c (ruserpass): Optimize by using stpcpy.
	(struct toktab): Make tokstr field a const char *.

	* elf/dl-profile.c: Fix typo.

	* inet/ether_ntoh.c: Don't use relative #include path.
	* inet/gethstbynm.c: Likewise.
	* resolv/inet_pton.c: Likewise.
	* shadow/sgetspent_r.c: Likewise.

	* libio/oldfileops.c (_IO_old_file_jumps): Use correct sync and write
	callbacks.  Patch by NIIBE Yutaka <gniibe@mri.co.jp>.

	* posix/confstr.c: Correct string for _CS_LFS_CFLAGS.
	Handle _CS_XBS5_* constants.
	* posix/unistd.h: Add comment describing _XBS5_* constants.
	* sysdeps/generic/bits/confname.h: Add _CS_XBS5_* constants.

	* posix/regex.c: Indent preprocessor code.

	* posix/wordexp.c: Using _itoa_word instead of sprintf.

	* stdlib/canonicalize.c: Avoid unnecessary copying.  Handle NULL
	and "" arguments correctly according to SUS.
	* stdlib/test-canon.c: Test "" and NULL argument handling.

	* sysdeps/posix/writev.c: Correct condition to leave the loop.

1997-11-05 18:13  Ulrich Drepper  <drepper@cygnus.com>

	* nss/getXXbyYY.c: Set buffer to NULL if realloc fails so that possible
	next call starts with malloc again.
	Proposed by Joe Keane <jgk@jgk.org>.

1997-11-04 23:57  Ulrich Drepper  <drepper@cygnus.com>

	* configure.in: Correct gcc -pipe test.
	Patch by Zack Weinberg <zack@rabi.phys.columbia.edu>.

	* posix/glob.c: Cleanups.  Patch by H.J. Lu <hjl@lucon.org>.

1997-11-04  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* manual/creature.texi (Feature Test Macros): Add _POSIX_C_SOURCE
	definition.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/canonicalize.c39
-rw-r--r--stdlib/msort.c5
-rw-r--r--stdlib/test-canon.c24
3 files changed, 54 insertions, 14 deletions
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c
index ea7883dba5..3617226f0a 100644
--- a/stdlib/canonicalize.c
+++ b/stdlib/canonicalize.c
@@ -45,6 +45,22 @@ canonicalize (const char *name, char *resolved)
   long int path_max;
   int num_links = 0;
 
+  if (name == NULL || resolved == NULL)
+    {
+      /* As per Single Unix Specification V2 we must return an error if
+	 either parameter is a null pointer.  */
+      __set_errno (EINVAL);
+      return NULL;
+    }
+
+  if (name[0] == '\0')
+    {
+      /* As per Single Unix Specification V2 we must return an error if
+	 the name argument points to an empty string.  */
+      __set_errno (ENOENT);
+      return NULL;
+    }
+
 #ifdef PATH_MAX
   path_max = PATH_MAX;
 #else
@@ -73,21 +89,23 @@ canonicalize (const char *name, char *resolved)
       struct stat st;
       int n;
 
-      /* skip sequence of multiple path-separators: */
+      /* Skip sequence of multiple path-separators.  */
       while (*start == '/') ++start;
 
-      /* find end of path component: */
+      /* Find end of path component.  */
       for (end = start; *end && *end != '/'; ++end);
 
       if (end - start == 0)
 	break;
       else if (strncmp (start, ".", end - start) == 0)
 	/* nothing */;
-      else if (strncmp (start, "..", end - start) == 0) {
-	/* back up to previous component, ignore if at root already: */
-	if (dest > rpath + 1)
-	  while ((--dest)[-1] != '/');
-      } else
+      else if (strncmp (start, "..", end - start) == 0)
+	{
+	  /* Back up to previous component, ignore if at root already.  */
+	  if (dest > rpath + 1)
+	    while ((--dest)[-1] != '/');
+	}
+      else
 	{
 	  size_t new_size;
 
@@ -112,8 +130,7 @@ canonicalize (const char *name, char *resolved)
 		return NULL;
 	    }
 
-	  memcpy (dest, start, end - start);
-	  dest += end - start;
+	  dest = __mempcpy (dest, start, end - start);
 	  *dest = '\0';
 
 	  if (__lstat (rpath, &st) < 0)
@@ -146,8 +163,8 @@ canonicalize (const char *name, char *resolved)
 		}
 
 	      /* Careful here, end may be a pointer into extra_buf... */
-	      memcpy (&buf[n], end, len + 1);
-	      strcpy (extra_buf, buf);
+	      memmove (&extra_buf[n], end, len + 1);
+	      memcpy (extra_buf, buf, n);
 	      name = end = extra_buf;
 
 	      if (buf[0] == '/')
diff --git a/stdlib/msort.c b/stdlib/msort.c
index 4cd3e3f167..1c36a4cb9c 100644
--- a/stdlib/msort.c
+++ b/stdlib/msort.c
@@ -71,17 +71,16 @@ msort_with_tmp (b, n, s, cmp, t)
       {
 	if ((*cmp) (b1, b2) <= 0)
 	  {
-	    memcpy (tmp, b1, s);
+	    tmp = (char *) __mempcpy (tmp, b1, s);
 	    b1 += s;
 	    --n1;
 	  }
 	else
 	  {
-	    memcpy (tmp, b2, s);
+	    tmp = (char *) __mempcpy (tmp, b2, s);
 	    b2 += s;
 	    --n2;
 	  }
-	tmp += s;
       }
   if (n1 > 0)
     memcpy (tmp, b1, n1 * s);
diff --git a/stdlib/test-canon.c b/stdlib/test-canon.c
index ffd6fa99d4..c239d50ae8 100644
--- a/stdlib/test-canon.c
+++ b/stdlib/test-canon.c
@@ -117,6 +117,30 @@ main (int argc, char ** argv)
   getcwd (cwd, sizeof(buf));
   cwd_len = strlen (cwd);
 
+  errno = 0;
+  if (realpath (NULL, buf) != NULL || errno != EINVAL)
+    {
+      printf ("%s: expected return value NULL and errno set to EINVAL"
+	      " for realpath(NULL,...)\n", argv[0]);
+      ++errors;
+    }
+
+  errno = 0;
+  if (realpath ("/", NULL) != NULL || errno != EINVAL)
+    {
+      printf ("%s: expected return value NULL and errno set to EINVAL"
+	      " for realpath(...,NULL)\n", argv[0]);
+      ++errors;
+    }
+
+  errno = 0;
+  if (realpath ("", buf) != NULL || errno != ENOENT)
+    {
+      printf ("%s: expected return value NULL and set errno to ENOENT",
+	      " for realpath(\"\",...)\n", argv[0]);
+      ++errors;
+    }
+
   for (i = 0; i < (int) (sizeof (symlinks) / sizeof (symlinks[0])); ++i)
     symlink (symlinks[i].value, symlinks[i].name);