[PATCH] realpath stack usage 8k -> 4k

Denys Vlasenko vda.linux at googlemail.com
Wed May 7 19:27:17 UTC 2008


On Wednesday 07 May 2008 21:06, Denys Vlasenko wrote:
> Tests 14 and 15 say in source:
> 
>   /* 10 */
>   {"./doesExist/../doesExist",          "./doesExist"},
>   {"foobar",                            0, "./foobar", ENOENT},
>   {".",                                 "."},
>   {"./foobar",                          0, "./foobar", ENOENT},
> #ifdef __UCLIBC__
>   /* we differ from glibc here, but POSIX allows it as it says that if we did
>    * not successfuly complete, the value of resolved_path is undefined */
>   {"SYMLINK_LOOP",                      0, "", ELOOP},
>   /* 15 */
>   {"./SYMLINK_LOOP",                    0, "", ELOOP},
> #else
> 
> I can make it work so that test passes. However, as this comment says,
> POSIX says nothing about return buffer's contents, so alternative
> fix would be to not check its contents, only return value and errno.
> 
> Do you want me to make readlink return ""

which can be done this way:

                /* Protect against infinite loops. */
                if (readlinks++ > MAX_READLINKS) {
                        __set_errno(ELOOP);
+                       got_path[0] = '\0';
                        return NULL;
                }



> or to stop testing buffer's contents?

this way:

--- test-canon-old.c	Wed May  7 21:22:49 2008
+++ test-canon.c	Wed May  7 21:25:14 2008
@@ -72,17 +72,9 @@
   {"foobar",				0, "./foobar", ENOENT},
   {".",					"."},
   {"./foobar",				0, "./foobar", ENOENT},
-#ifdef __UCLIBC__
-  /* we differ from glibc here, but POSIX allows it as it says that if we did
-   * not successfuly complete, the value of resolved_path is undefined */
-  {"SYMLINK_LOOP",			0, "", ELOOP},
+  {"SYMLINK_LOOP",			0, 0, ELOOP},
   /* 15 */
-  {"./SYMLINK_LOOP",			0, "", ELOOP},
-#else
-  {"SYMLINK_LOOP",			0, "./SYMLINK_LOOP", ELOOP},
-  /* 15 */
-  {"./SYMLINK_LOOP",			0, "./SYMLINK_LOOP", ELOOP},
-#endif
+  {"./SYMLINK_LOOP",			0, 0, ELOOP},
   {"SYMLINK_1",				"."},
   {"SYMLINK_1/foobar",			0, "./foobar", ENOENT},
   {"SYMLINK_2",				"/etc"},
@@ -191,7 +183,8 @@
 	  continue;
 	}
 
-      if (!check_path (buf, tests[i].out ? tests[i].out : tests[i].resolved))
+      if ((tests[i].out || tests[i].resolved)
+       && !check_path (buf, tests[i].out ? tests[i].out : tests[i].resolved))
 	{
 	  printf ("%s: flunked test %d (expected resolved `%s', got `%s')\n",
 		  argv[0], i, tests[i].out ? tests[i].out : tests[i].resolved,


> Your pick. 

--
vda



More information about the uClibc mailing list