PERFORCE change 174218 for review
Robert Watson
rwatson at FreeBSD.org
Wed Feb 3 10:34:48 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=174218
Change 174218 by rwatson at rwatson_vimage_client on 2010/02/03 10:34:01
Keep a running count of valid file descriptors in the directory
length array, rather than marking unused ones as (-1). This avoids
several loops. While here, fix a (+ sizeof(int)) into a
(* sizeof(int)) and a few other nits.
Affected files ...
.. //depot/projects/trustedbsd/capabilities/src/libexec/rtld-elf/rtld.c#38 edit
Differences ...
==== //depot/projects/trustedbsd/capabilities/src/libexec/rtld-elf/rtld.c#38 (text+ko) ====
@@ -188,7 +188,9 @@
static char *ld_bind_now; /* Environment variable for immediate binding */
static char *ld_debug; /* Environment variable for debugging */
static int *ld_library_dirs = NULL; /* File descriptors of lib path (end: -1) */
+static int ld_library_dirs_done; /* ld_library_dirs has been initialized */
static int ld_library_dirlen; /* Capacity of ld_library_dirs */
+static int ld_library_dircount; /* Number of entries in ld_library_dirs */
#ifndef IN_RTLD_CAP
static char *ld_library_path; /* Environment variable for search path */
static char *ld_preload; /* Environment variable for libraries to
@@ -1240,9 +1242,9 @@
{
int fd, i;
- if (ld_library_dirs == NULL)
+ if (!ld_library_dirs_done)
init_libdirs();
- for (i = 0; (i < ld_library_dirlen) && (ld_library_dirs[i] != -1); i++) {
+ for (i = 0; i < ld_library_dircount); i++) {
fd = openat(ld_library_dirs[i], name, O_RDONLY);
if (fd >= 0)
return (fd);
@@ -2111,35 +2113,39 @@
/*
* Add a file descriptor to ld_library_dirs.
+ *
+ * XXX: This may be called from either the rtld startup code, or from
+ * ld_libdirs. We have no way to distinguish them on error, so die()
+ * unconditionally. Perhaps the latter case should allow graceful failure.
+ *
+ * XXX: Synchronization?
*/
static void
add_libdir_fd(int fd)
{
- int i;
- if (ld_library_dirs == NULL) {
- /* Initialize the FD list. */
+ /* Initialize the FD list. */
+ if (!ld_library_dirs_done) {
ld_library_dirlen = INITIAL_FDLEN;
+ ld_library_dircount = 0;
ld_library_dirs = xmalloc(ld_library_dirlen * sizeof(int));
- memset(ld_library_dirs, 0xff, ld_library_dirlen * sizeof(int));
+ ld_library_dirs_done = 1;
}
- /* Find the next available FD slot. */
- for (i = 0; (i < ld_library_dirlen) && (ld_library_dirs[i] != -1); i++)
- ;
-
- if (i == ld_library_dirlen) {
- /* We need more space. */
- int old_size = ld_library_dirlen + sizeof(int);
-
+ /* Do we need to grow? */
+ if (ld_library_dirlen == ld_library_dircount) {
ld_library_dirlen *= 2;
- ld_library_dirs = realloc(ld_library_dirs, 2 * old_size);
- memset(ld_library_dirs + old_size, 0xff, old_size);
+ ld_library_dirs = realloc(ld_library_dirs,
+ ld_library_dirlen * sizeof(int));
+ if (ld_library_dirs == NULL) {
+ _rtld_error("add_libdir_fd: realloc failed");
+ die();
+ }
+ }
- if (ld_library_dirs == NULL)
- err(-1, "realloc() failed");
- }
- ld_library_dirs[i] = fd;
+ /* Add the new library directory fd to the end. */
+ ld_library_dirs[ld_library_dircount] = fd;
+ ld_library_dircount++;
}
/*
@@ -2204,12 +2210,6 @@
add_libdir_paths(gethints());
add_libdir_paths(STANDARD_LIBRARY_PATH);
#endif
-
- /* If all else fails, create an empty array */
- if (ld_library_dirlen == 0) {
- ld_library_dirs = malloc(sizeof(int));
- ld_library_dirs[0] = -1;
- }
}
/*
@@ -2220,7 +2220,6 @@
int
ld_libdirs(int *fds, int *fdcount)
{
- int i = 0;
if (fdcount == NULL)
return (-1);
@@ -2228,16 +2227,14 @@
*fdcount = -1;
return (-1);
}
- if (ld_library_dirs == NULL)
+ if (!ld_library_dirs_done)
init_libdirs();
- for (i = 0; (i < ld_library_dirlen) && (ld_library_dirs[i] != -1); i++)
- ;
- if (*fdcount < i) {
- *fdcount = i;
+ if (*fdcount < ld_library_dircount) {
+ *fdcount = ld_library_dircount;
return (-1);
}
- *fdcount = i;
- memcpy(fds, ld_library_dirs, i * sizeof(int));
+ *fdcount = ld_library_dircount;
+ memcpy(fds, ld_library_dirs, ld_library_dircount * sizeof(int));
return (0);
}
More information about the p4-projects
mailing list