aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-08-03 23:12:03 +0000
committerChristian Grothoff <christian@grothoff.org>2012-08-03 23:12:03 +0000
commit75e75df48fcb787b355a4f940334edfe50a5ff1f (patch)
tree255e0de37c6992b80074c7552faeb318af71337c
parent4f311ae2ea4b9c12b8d5a202b5bc2e2ea3649c40 (diff)
downloadlibextractor-75e75df48fcb787b355a4f940334edfe50a5ff1f.tar.gz
libextractor-75e75df48fcb787b355a4f940334edfe50a5ff1f.zip
make lib finding more robust
-rw-r--r--src/main/extractor_plugpath.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/main/extractor_plugpath.c b/src/main/extractor_plugpath.c
index c8abff9..48397e3 100644
--- a/src/main/extractor_plugpath.c
+++ b/src/main/extractor_plugpath.c
@@ -504,6 +504,7 @@ find_plugin_in_path (void *cls,
504 const char *sym_name; 504 const char *sym_name;
505 char *sym; 505 char *sym;
506 char *dot; 506 char *dot;
507 size_t dlen;
507 508
508 if (NULL != sc->path) 509 if (NULL != sc->path)
509 return; 510 return;
@@ -513,8 +514,10 @@ find_plugin_in_path (void *cls,
513 { 514 {
514 if ('.' == ent->d_name[0]) 515 if ('.' == ent->d_name[0])
515 continue; 516 continue;
516 if ( (NULL == strstr (ent->d_name, ".so")) && 517 dlen = strlen (ent->d_name);
517 (NULL == strstr (ent->d_name, ".dll")) ) 518 if ( (dlen < 4) ||
519 ( (0 != strcmp (&ent->d_name[dlen-3], ".so")) &&
520 (0 != strcasecmp (&ent->d_name[dlen-4], ".dll")) ) )
518 continue; /* only load '.so' and '.dll' */ 521 continue; /* only load '.so' and '.dll' */
519 if (NULL == (sym_name = strrchr (ent->d_name, '_'))) 522 if (NULL == (sym_name = strrchr (ent->d_name, '_')))
520 continue; 523 continue;
@@ -590,6 +593,7 @@ load_plugins_from_dir (void *cls,
590 const char *sym_name; 593 const char *sym_name;
591 char *sym; 594 char *sym;
592 char *dot; 595 char *dot;
596 size_t dlen;
593 597
594 if (NULL == (dir = opendir (path))) 598 if (NULL == (dir = opendir (path)))
595 return; 599 return;
@@ -597,8 +601,10 @@ load_plugins_from_dir (void *cls,
597 { 601 {
598 if (ent->d_name[0] == '.') 602 if (ent->d_name[0] == '.')
599 continue; 603 continue;
600 if ( (NULL == strstr (ent->d_name, ".so")) && 604 dlen = strlen (ent->d_name);
601 (NULL == strstr (ent->d_name, ".dll")) ) 605 if ( (dlen < 4) ||
606 ( (0 != strcmp (&ent->d_name[dlen-3], ".so")) &&
607 (0 != strcasecmp (&ent->d_name[dlen-4], ".dll")) ) )
602 continue; /* only load '.so' and '.dll' */ 608 continue; /* only load '.so' and '.dll' */
603 if (NULL == (sym_name = strrchr (ent->d_name, '_'))) 609 if (NULL == (sym_name = strrchr (ent->d_name, '_')))
604 continue; 610 continue;