mirror of
git://git.savannah.gnu.org/libtool.git
synced 2025-02-17 15:10:02 +08:00
* 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.
This commit is contained in:
parent
662305576a
commit
48fcf6a997
12
ChangeLog
12
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
|
||||
|
@ -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 *
|
||||
|
Loading…
Reference in New Issue
Block a user