123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- From: Debian Cyrus SASL Team
- <pkg-cyrus-sasl2-debian-devel@lists.alioth.debian.org>
- Date: Thu, 24 Mar 2016 11:35:04 +0100
- Subject: Don't use la files for opening plugins
- ---
- lib/dlopen.c | 121 ++++-------------------------------------------------------
- 1 file changed, 7 insertions(+), 114 deletions(-)
- diff --git a/lib/dlopen.c b/lib/dlopen.c
- index 8284cd8..ef90b11 100644
- --- a/lib/dlopen.c
- +++ b/lib/dlopen.c
- @@ -246,113 +246,6 @@ static int _sasl_plugin_load(char *plugin, void *library,
- return result;
- }
-
- -/* this returns the file to actually open.
- - * out should be a buffer of size PATH_MAX
- - * and may be the same as in. */
- -
- -/* We'll use a static buffer for speed unless someone complains */
- -#define MAX_LINE 2048
- -
- -static int _parse_la(const char *prefix, const char *in, char *out)
- -{
- - FILE *file;
- - size_t length;
- - char line[MAX_LINE];
- - char *ntmp = NULL;
- -
- - if(!in || !out || !prefix || out == in) return SASL_BADPARAM;
- -
- - /* Set this so we can detect failure */
- - *out = '\0';
- -
- - length = strlen(in);
- -
- - if (strcmp(in + (length - strlen(LA_SUFFIX)), LA_SUFFIX)) {
- - if(!strcmp(in + (length - strlen(SO_SUFFIX)),SO_SUFFIX)) {
- - /* check for a .la file */
- - if (strlen(prefix) + strlen(in) + strlen(LA_SUFFIX) + 1 >= MAX_LINE)
- - return SASL_BADPARAM;
- - strcpy(line, prefix);
- - strcat(line, in);
- - length = strlen(line);
- - *(line + (length - strlen(SO_SUFFIX))) = '\0';
- - strcat(line, LA_SUFFIX);
- - file = fopen(line, "r");
- - if(file) {
- - /* We'll get it on the .la open */
- - fclose(file);
- - return SASL_FAIL;
- - }
- - }
- - if (strlen(prefix) + strlen(in) + 1 >= PATH_MAX)
- - return SASL_BADPARAM;
- - strcpy(out, prefix);
- - strcat(out, in);
- - return SASL_OK;
- - }
- -
- - if (strlen(prefix) + strlen(in) + 1 >= MAX_LINE)
- - return SASL_BADPARAM;
- - strcpy(line, prefix);
- - strcat(line, in);
- -
- - file = fopen(line, "r");
- - if(!file) {
- - _sasl_log(NULL, SASL_LOG_WARN,
- - "unable to open LA file: %s", line);
- - return SASL_FAIL;
- - }
- -
- - while(!feof(file)) {
- - if(!fgets(line, MAX_LINE, file)) break;
- - if(line[strlen(line) - 1] != '\n') {
- - _sasl_log(NULL, SASL_LOG_WARN,
- - "LA file has too long of a line: %s", in);
- - fclose(file);
- - return SASL_BUFOVER;
- - }
- - if(line[0] == '\n' || line[0] == '#') continue;
- - if(!strncmp(line, "dlname=", sizeof("dlname=") - 1)) {
- - /* We found the line with the name in it */
- - char *end;
- - char *start;
- - size_t len;
- - end = strrchr(line, '\'');
- - if(!end) continue;
- - start = &line[sizeof("dlname=")-1];
- - len = strlen(start);
- - if(len > 3 && start[0] == '\'') {
- - ntmp=&start[1];
- - *end='\0';
- - /* Do we have dlname="" ? */
- - if(ntmp == end) {
- - _sasl_log(NULL, SASL_LOG_DEBUG,
- - "dlname is empty in .la file: %s", in);
- - fclose(file);
- - return SASL_FAIL;
- - }
- - strcpy(out, prefix);
- - strcat(out, ntmp);
- - }
- - break;
- - }
- - }
- - if(ferror(file) || feof(file)) {
- - _sasl_log(NULL, SASL_LOG_WARN,
- - "Error reading .la: %s\n", in);
- - fclose(file);
- - return SASL_FAIL;
- - }
- - fclose(file);
- -
- - if(!(*out)) {
- - _sasl_log(NULL, SASL_LOG_WARN,
- - "Could not find a dlname line in .la file: %s", in);
- - return SASL_FAIL;
- - }
- -
- - return SASL_OK;
- -}
- #endif /* DO_DLOPEN */
-
- /* loads a plugin library */
- @@ -506,18 +399,18 @@ int _sasl_load_plugins(const add_plugin_list_t *entrypoints,
- if (length + pos>=PATH_MAX) continue; /* too big */
-
- if (strcmp(dir->d_name + (length - strlen(SO_SUFFIX)),
- - SO_SUFFIX)
- - && strcmp(dir->d_name + (length - strlen(LA_SUFFIX)),
- - LA_SUFFIX))
- + SO_SUFFIX))
- continue;
-
- + /* We only use .so files for loading plugins */
- +
- memcpy(name,dir->d_name,length);
- name[length]='\0';
-
- - result = _parse_la(prefix, name, tmp);
- - if(result != SASL_OK)
- - continue;
- -
- + /* Create full name with path */
- + strncpy(tmp, prefix, PATH_MAX);
- + strncat(tmp, name, PATH_MAX);
- +
- /* skip "lib" and cut off suffix --
- this only need be approximate */
- strcpy(plugname, name + 3);
|