]> git.ipfire.org Git - thirdparty/libtool.git/commitdiff
* libltdl/ltdl.c (FILENAME_MAX): use it instead of MAX_FILENAME,
authorAlexandre Oliva <oliva@dcc.unicamp.br>
Sun, 10 Jan 1999 19:15:01 +0000 (19:15 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Sun, 10 Jan 1999 19:15:01 +0000 (19:15 +0000)
and don't redefine it if already defined; default to 1024, as on
most systems
(LT_SYMBOL_LENGTH): renamed from MAX_SYMBOL_LENGTH
(LT_SYMBOL_OVERHEAD): new macro, that accounts for the size of
  the _LTX_ separator and the initial underscore
(lt_dlsym): sym now points to a stack buffer (lsym) if possible,
or is dynamically allocated.  If allocation fails, a
buffer_overflow_error is returned.

ChangeLog
libltdl/ltdl.c

index 688d6be40562e4bcd33c5896fb580abba65bd1a1..d8f522906defedfcf21a1ce80170362c9de33731 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+1999-01-10  Alexandre Oliva  <oliva@dcc.unicamp.br>
+
+       * libltdl/ltdl.c (FILENAME_MAX): use it instead of MAX_FILENAME,
+       and don't redefine it if already defined; default to 1024, as on
+       most systems
+       (LT_SYMBOL_LENGTH): renamed from MAX_SYMBOL_LENGTH
+       (LT_SYMBOL_OVERHEAD): new macro, that accounts for the size of
+       the _LTX_ separator and the initial underscore
+       (lt_dlsym): sym now points to a stack buffer (lsym) if possible,
+       or is dynamically allocated.  If allocation fails, a
+       buffer_overflow_error is returned.
+
 1999-01-10  Thomas Tanner  <tanner@gmx.de>
 
        * ltmain.in: define dld_preloaded_symbols if at least one of
index 1d4b10f3128b9fa39230edecfaa773a938d584ba..0a372ad0d49ca88a3d568482d6f9e696f1e85d46 100644 (file)
@@ -705,8 +705,9 @@ tryall_dlopen (handle, filename)
        return 0;
 }
 
-#undef MAX_FILENAME
-#define MAX_FILENAME 2048
+#ifndef FILENAME_MAX
+#define FILENAME_MAX 1024
+#endif
 
 static int
 find_module (handle, dir, libdir, dlname, old_name)
@@ -716,12 +717,12 @@ find_module (handle, dir, libdir, dlname, old_name)
        const char *dlname;
        const char *old_name;
 {
-       char    fullname[MAX_FILENAME];
+       char    fullname[FILENAME_MAX];
        
        /* search a module */
        if (*dlname) {
                /* try to open the installed module */
-               if (strlen(libdir)+strlen(dlname)+1 < MAX_FILENAME) {
+               if (strlen(libdir)+strlen(dlname)+1 < FILENAME_MAX) {
                        strcpy(fullname, libdir);
                        strcat(fullname, "/");
                        strcat(fullname, dlname);
@@ -729,14 +730,14 @@ find_module (handle, dir, libdir, dlname, old_name)
                                return 0;
                }
                /* try to open the not-installed module */
-               if (strlen(dir)+strlen(dlname)+6 < MAX_FILENAME) {
+               if (strlen(dir)+strlen(dlname)+6 < FILENAME_MAX) {
                        strcpy(fullname, dir);
                        strcat(fullname, ".libs/");
                        strcat(fullname, dlname);
                        if (tryall_dlopen(handle, fullname) == 0)
                                return 0;
                }
-               if (strlen(dir)+strlen(dlname) < MAX_FILENAME) {
+               if (strlen(dir)+strlen(dlname) < FILENAME_MAX) {
                        strcpy(fullname, dir);
                        strcat(fullname, dlname);
                        if (tryall_dlopen(handle, fullname) == 0)
@@ -762,7 +763,7 @@ lt_dlopen (filename)
 {
        lt_dlhandle handle;
        FILE    *file;
-       char    dir[MAX_FILENAME], tmp[MAX_FILENAME];
+       char    dir[FILENAME_MAX], tmp[FILENAME_MAX];
        const char *basename, *ext, *search_path;
        const char *saved_error = last_error;
        
@@ -771,7 +772,7 @@ lt_dlopen (filename)
                basename++;
        else
                basename = filename;
-       if (basename - filename >= MAX_FILENAME) {
+       if (basename - filename >= FILENAME_MAX) {
                last_error = buffer_overflow_error;
                return 0;
        }
@@ -781,8 +782,8 @@ lt_dlopen (filename)
        /* check whether we open a libtool module (.la extension) */
        ext = strrchr(basename, '.');
        if (ext && strcmp(ext, ".la") == 0) {
-               char    dlname[MAX_FILENAME], old_name[MAX_FILENAME];
-               char    libdir[MAX_FILENAME], preload[MAX_FILENAME];
+               char    dlname[FILENAME_MAX], old_name[FILENAME_MAX];
+               char    libdir[FILENAME_MAX], preload[FILENAME_MAX];
                int     i;
 
                dlname[0] = old_name[0] = libdir[0] = preload[0] = '\0';
@@ -798,7 +799,7 @@ lt_dlopen (filename)
                        while (!file && p) {
                                next = strchr(p, ':');
                                if (next) {
-                                       if (next - p + 1 >= MAX_FILENAME) {
+                                       if (next - p + 1 >= FILENAME_MAX) {
                                                last_error = buffer_overflow_error;
                                                return 0;
                                        }
@@ -806,7 +807,7 @@ lt_dlopen (filename)
                                        dir[next - p] = '\0';
                                        p = next+1;
                                } else {
-                                       if (strlen(p)+1 >= MAX_FILENAME) {
+                                       if (strlen(p)+1 >= FILENAME_MAX) {
                                                last_error = buffer_overflow_error;
                                                return 0;
                                        }
@@ -816,7 +817,7 @@ lt_dlopen (filename)
                                if (!*dir)
                                        continue;
                                strcat(dir, "/");
-                               if (strlen(dir)+strlen(basename) < MAX_FILENAME) {
+                               if (strlen(dir)+strlen(basename) < FILENAME_MAX) {
                                        strcpy(tmp, dir);
                                        strcat(tmp, basename);
                                        file = fopen(tmp, READTEXT_MODE);
@@ -828,7 +829,7 @@ lt_dlopen (filename)
                        return 0;
                }
                while (!feof(file)) {
-                       if (!fgets(tmp, MAX_FILENAME, file))
+                       if (!fgets(tmp, FILENAME_MAX, file))
                                break;
                        if (strncmp(tmp, "dlname=", 7) == 0)
                                trim(dlname, &tmp[7]);
@@ -856,7 +857,7 @@ lt_dlopen (filename)
                        return 0;
                }
                /* extract the module name from the file name */
-               if (strlen(basename) >= MAX_FILENAME) {
+               if (strlen(basename) >= FILENAME_MAX) {
                        last_error = buffer_overflow_error;
                        return 0;
                }
@@ -887,7 +888,7 @@ lt_dlopen (filename)
                                while (error && p) {
                                        next = strchr(p, ':');
                                        if (next) {
-                                               if (next - p + 1 >= MAX_FILENAME) {
+                                               if (next - p + 1 >= FILENAME_MAX) {
                                                        last_error = buffer_overflow_error;
                                                        return 0;
                                                }
@@ -895,7 +896,7 @@ lt_dlopen (filename)
                                                dir[next - p] = '\0';
                                                p = next+1;
                                        } else {
-                                               if (strlen(p)+1 >= MAX_FILENAME) {
+                                               if (strlen(p)+1 >= FILENAME_MAX) {
                                                        last_error = buffer_overflow_error;
                                                        return 0;
                                                }
@@ -905,7 +906,7 @@ lt_dlopen (filename)
                                        if (!*dir)
                                                continue;
                                        strcat(dir, "/");
-                                       if (strlen(dir)+strlen(basename) < MAX_FILENAME) {
+                                       if (strlen(dir)+strlen(basename) < FILENAME_MAX) {
                                                strcpy(tmp, dir);
                                                strcat(tmp, basename);
                                                error = tryall_dlopen(&handle, tmp);
@@ -961,49 +962,60 @@ lt_dlclose (handle)
        return 0;
 }
 
-#define MAX_SYMBOL_LENGTH      256
+#undef LT_SYMBOL_LENGTH
+/* This is the maximum symbol size that won't require malloc/free */
+#define LT_SYMBOL_LENGTH       256
+
+#undef LT_SYMBOL_OVERHEAD
+/* This accounts for the _LTX_ separator and the initial underscore */
+#define LT_SYMBOL_OVERHEAD     10
 
 lt_ptr_t
 lt_dlsym (handle, symbol)
        lt_dlhandle handle;
        const char *symbol;
 {
-       char    sym[MAX_SYMBOL_LENGTH];
+       int lensym = strlen(symbol), lenhand = strlen(handle->name);
+       char lsym[LT_SYMBOL_LENGTH];
+       char *sym = ((lensym + lenhand + LT_SYMBOL_OVERHEAD < LT_SYMBOL_LENGTH)
+                    ? lsym
+                    : malloc(lensym + lenhand + LT_SYMBOL_OVERHEAD));
        lt_ptr_t address;
 
-       if (strlen(symbol) >= MAX_SYMBOL_LENGTH) {
+       if (sym == 0) {
                last_error = buffer_overflow_error;
                return 0;
        }
 #ifdef NEED_USCORE
-       if (handle->name && strlen(handle->name) < MAX_SYMBOL_LENGTH-6) {
-               /* this is a libtool module */
-               /* prefix symbol with leading underscore */
-               strcpy(sym, "_");
-               strcat(sym, handle->name);
+       /* this is a libtool module */
+       /* prefix symbol with leading underscore */
+       strcpy(sym, "_");
+       strcat(sym, handle->name);
 #else
-       if (handle->name && strlen(handle->name) < MAX_SYMBOL_LENGTH-5) {
-               /* this is a libtool module */
-               strcpy(sym, handle->name);
+       /* this is a libtool module */
+       strcpy(sym, handle->name);
 #endif
-               strcat(sym, "_LTX_");
-               if (strlen(sym)+strlen(symbol) < MAX_SYMBOL_LENGTH) {
-                       strcat(sym, symbol);
-                       /* try "modulename_LTX_symbol" */
-                       address = handle->type->find_sym(handle, sym);
-                       if (address)
-                               return address;
-               }
+       strcat(sym, "_LTX_");
+       strcat(sym, symbol);
+       /* try "modulename_LTX_symbol" */
+       address = handle->type->find_sym(handle, sym);
+       if (address) {
+               if (sym != lsym)
+                       free(sym);
+               return address;
        }
        /* otherwise try "symbol" */
 #ifdef NEED_USCORE
        /* prefix symbol with leading underscore */
        strcpy(sym, "_");
        strcat(sym, symbol);
-       return handle->type->find_sym(handle, sym);
+       address = handle->type->find_sym(handle, sym);
 #else
-       return handle->type->find_sym(handle, symbol);
+       address = handle->type->find_sym(handle, symbol);
 #endif
+       if (sym != lsym)
+               free(sym);
+       return address;
 }
 
 const char *