----- Original Message ----- > Updated Branches: > refs/heads/master 00897775d -> cd86569e9 > > > TS-2425: Update to TS-2261 for loading plugins as root > > > Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo > Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/cd86569e > Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/cd86569e > Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/cd86569e > > Branch: refs/heads/master > Commit: cd86569e9342829fe72e7a4b6492157fb352fa0b > Parents: 0089777 > Author: Bryan Call <bc...@apache.org> > Authored: Thu Jan 23 15:50:14 2014 +0100 > Committer: Bryan Call <bc...@apache.org> > Committed: Thu Jan 23 15:50:14 2014 +0100 > > ---------------------------------------------------------------------- > CHANGES | 2 + > proxy/Plugin.cc | 34 +++++++-------- > proxy/http/remap/RemapConfig.cc | 85 +++++++++++++++++------------------- > proxy/http/remap/UrlMapping.cc | 7 +-- > 4 files changed, 59 insertions(+), 69 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cd86569e/CHANGES > ---------------------------------------------------------------------- > diff --git a/CHANGES b/CHANGES > index 0140b40..e795406 100644 > --- a/CHANGES > +++ b/CHANGES > @@ -1,6 +1,8 @@ > -*- coding: utf-8 > -*- > Changes with Apache Traffic Server 4.2.0 > > + *) [TS-2425] Update to TS-2261 for loading plugins as root > + > *) [TS-2505] Add traffic_line --offline option. > > *) [TS-2305] Fall back to ftruncate if posix_fallocate fails. > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cd86569e/proxy/Plugin.cc > ---------------------------------------------------------------------- > diff --git a/proxy/Plugin.cc b/proxy/Plugin.cc > index 56e2a68..0d315b6 100644 > --- a/proxy/Plugin.cc > +++ b/proxy/Plugin.cc > @@ -111,29 +111,29 @@ plugin_load(int argc, char *argv[]) > } > plugin_reg_temp = (plugin_reg_temp->link).next; > } > - > - handle = dll_open(path); > - if (!handle) { > - Fatal("unable to load '%s': %s", path, dll_error(handle)); > - } > - > - // Allocate a new registration structure for the > - // plugin we're starting up > - ink_assert(plugin_reg_current == NULL); > - plugin_reg_current = new PluginRegInfo; > - plugin_reg_current->plugin_path = ats_strdup(path); > - > - init = (init_func_t) dll_findsym(handle, "TSPluginInit"); > - if (!init) { > - Fatal("unable to find TSPluginInit function '%s': %s", path, > dll_error(handle)); > - } > - > // elevate the access to read files as root if compiled with capabilities, > if not > // change the effective user to root > { > uint32_t elevate_access = 0; > REC_ReadConfigInteger(elevate_access, > "proxy.config.plugin.load_elevated"); > ElevateAccess access(elevate_access != 0); > + > + handle = dll_open(path); > + if (!handle) { > + Fatal("unable to load '%s': %s", path, dll_error(handle)); > + } > + > + // Allocate a new registration structure for the > + // plugin we're starting up > + ink_assert(plugin_reg_current == NULL); > + plugin_reg_current = new PluginRegInfo; > + plugin_reg_current->plugin_path = ats_strdup(path); > + > + init = (init_func_t) dll_findsym(handle, "TSPluginInit"); > + if (!init) { > + Fatal("unable to find TSPluginInit function '%s': %s", path, > dll_error(handle)); > + } > + > init(argc, argv); > } // done elevating access > > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cd86569e/proxy/http/remap/RemapConfig.cc > ---------------------------------------------------------------------- > diff --git a/proxy/http/remap/RemapConfig.cc > b/proxy/http/remap/RemapConfig.cc > index bc4a16b..787fbb0 100644 > --- a/proxy/http/remap/RemapConfig.cc > +++ b/proxy/http/remap/RemapConfig.cc > @@ -663,44 +663,6 @@ remap_load_plugin(const char ** argv, int argc, > url_mapping *mp, char *errbuf, i > } > Debug("remap_plugin", "New remap plugin info created for \"%s\"", c); > > - if ((pi->dlh = dlopen(c, RTLD_NOW)) == NULL) { > -#if defined(freebsd) || defined(openbsd) > - err = (char *)dlerror(); > -#else > - err = dlerror(); > -#endif
Why is this #if dance necessary here? http://www.freebsd.org/cgi/man.cgi?dlerror dlerror() hasn't been const char* since FreeBSD 8.1. In OpenBSD it's still *is* ...broken, but then we should abstract that into a wrapper function of our own at autoconf time. We're not handling this case at every call of dlerror() anyways.. so.... > - snprintf(errbuf, errbufsize, "Can't load plugin \"%s\" - %s", c, err ? > err : "Unknown dlopen() error"); > - return -4; > - } > - pi->fp_tsremap_init = (remap_plugin_info::_tsremap_init *) > dlsym(pi->dlh, TSREMAP_FUNCNAME_INIT); > - pi->fp_tsremap_done = (remap_plugin_info::_tsremap_done *) > dlsym(pi->dlh, TSREMAP_FUNCNAME_DONE); > - pi->fp_tsremap_new_instance = (remap_plugin_info::_tsremap_new_instance > *) dlsym(pi->dlh, TSREMAP_FUNCNAME_NEW_INSTANCE); > - pi->fp_tsremap_delete_instance = > (remap_plugin_info::_tsremap_delete_instance *) dlsym(pi->dlh, > TSREMAP_FUNCNAME_DELETE_INSTANCE); > - pi->fp_tsremap_do_remap = (remap_plugin_info::_tsremap_do_remap *) > dlsym(pi->dlh, TSREMAP_FUNCNAME_DO_REMAP); > - pi->fp_tsremap_os_response = (remap_plugin_info::_tsremap_os_response *) > dlsym(pi->dlh, TSREMAP_FUNCNAME_OS_RESPONSE); > - > - if (!pi->fp_tsremap_init) { > - snprintf(errbuf, errbufsize, "Can't find \"%s\" function in remap > plugin \"%s\"", TSREMAP_FUNCNAME_INIT, c); > - retcode = -10; > - } else if (!pi->fp_tsremap_new_instance) { > - snprintf(errbuf, errbufsize, "Can't find \"%s\" function in remap > plugin \"%s\"", > - TSREMAP_FUNCNAME_NEW_INSTANCE, c); > - retcode = -11; > - } else if (!pi->fp_tsremap_do_remap) { > - snprintf(errbuf, errbufsize, "Can't find \"%s\" function in remap > plugin \"%s\"", TSREMAP_FUNCNAME_DO_REMAP, c); > - retcode = -12; > - } > - if (retcode) { > - if (errbuf && errbufsize > 0) > - Debug("remap_plugin", "%s", errbuf); > - dlclose(pi->dlh); > - pi->dlh = NULL; > - return retcode; > - } > - memset(&ri, 0, sizeof(ri)); > - ri.size = sizeof(ri); > - ri.tsremap_version = TSREMAP_VERSION; > - > // elevate the access to read files as root if compiled with > capabilities, if not > // change the effective user to root > { > @@ -708,6 +670,44 @@ remap_load_plugin(const char ** argv, int argc, > url_mapping *mp, char *errbuf, i > REC_ReadConfigInteger(elevate_access, > "proxy.config.plugin.load_elevated"); > ElevateAccess access(elevate_access != 0); > > + if ((pi->dlh = dlopen(c, RTLD_NOW)) == NULL) { > +#if defined(freebsd) || defined(openbsd) > + err = (char *)dlerror(); > +#else > + err = dlerror(); > +#endif > + snprintf(errbuf, errbufsize, "Can't load plugin \"%s\" - %s", c, err > ? err : "Unknown dlopen() error"); > + return -4; > + } > + pi->fp_tsremap_init = (remap_plugin_info::_tsremap_init *) > dlsym(pi->dlh, TSREMAP_FUNCNAME_INIT); > + pi->fp_tsremap_done = (remap_plugin_info::_tsremap_done *) > dlsym(pi->dlh, TSREMAP_FUNCNAME_DONE); > + pi->fp_tsremap_new_instance = > (remap_plugin_info::_tsremap_new_instance *) dlsym(pi->dlh, > TSREMAP_FUNCNAME_NEW_INSTANCE); > + pi->fp_tsremap_delete_instance = > (remap_plugin_info::_tsremap_delete_instance *) dlsym(pi->dlh, > TSREMAP_FUNCNAME_DELETE_INSTANCE); > + pi->fp_tsremap_do_remap = (remap_plugin_info::_tsremap_do_remap *) > dlsym(pi->dlh, TSREMAP_FUNCNAME_DO_REMAP); > + pi->fp_tsremap_os_response = (remap_plugin_info::_tsremap_os_response > *) dlsym(pi->dlh, TSREMAP_FUNCNAME_OS_RESPONSE); > + > + if (!pi->fp_tsremap_init) { > + snprintf(errbuf, errbufsize, "Can't find \"%s\" function in remap > plugin \"%s\"", TSREMAP_FUNCNAME_INIT, c); > + retcode = -10; > + } else if (!pi->fp_tsremap_new_instance) { > + snprintf(errbuf, errbufsize, "Can't find \"%s\" function in remap > plugin \"%s\"", > + TSREMAP_FUNCNAME_NEW_INSTANCE, c); > + retcode = -11; > + } else if (!pi->fp_tsremap_do_remap) { > + snprintf(errbuf, errbufsize, "Can't find \"%s\" function in remap > plugin \"%s\"", TSREMAP_FUNCNAME_DO_REMAP, c); > + retcode = -12; > + } > + if (retcode) { > + if (errbuf && errbufsize > 0) > + Debug("remap_plugin", "%s", errbuf); > + dlclose(pi->dlh); > + pi->dlh = NULL; > + return retcode; > + } > + memset(&ri, 0, sizeof(ri)); > + ri.size = sizeof(ri); > + ri.tsremap_version = TSREMAP_VERSION; > + > if (pi->fp_tsremap_init(&ri, tmpbuf, sizeof(tmpbuf) - 1) != > TS_SUCCESS) { > Warning("Failed to initialize plugin %s (non-zero retval) ... > bailing out", pi->path); > return -5; > @@ -768,14 +768,7 @@ remap_load_plugin(const char ** argv, int argc, > url_mapping *mp, char *errbuf, i > Debug("remap_plugin", "creating new plugin instance"); > > TSReturnCode res = TS_ERROR; > - // elevate the access to read files as root if compiled with capabilities, > if not > - // change the effective user to root > - { > - uint32_t elevate_access = 0; > - REC_ReadConfigInteger(elevate_access, > "proxy.config.plugin.load_elevated"); > - ElevateAccess access(elevate_access != 0); > - res = pi->fp_tsremap_new_instance(parc, parv, &ih, tmpbuf, > sizeof(tmpbuf) - 1); > - } // done elevating access > + res = pi->fp_tsremap_new_instance(parc, parv, &ih, tmpbuf, sizeof(tmpbuf) > - 1); > > Debug("remap_plugin", "done creating new plugin instance"); > > > http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cd86569e/proxy/http/remap/UrlMapping.cc > ---------------------------------------------------------------------- > diff --git a/proxy/http/remap/UrlMapping.cc b/proxy/http/remap/UrlMapping.cc > index d5b00d1..58739c1 100644 > --- a/proxy/http/remap/UrlMapping.cc > +++ b/proxy/http/remap/UrlMapping.cc > @@ -79,13 +79,8 @@ url_mapping::delete_instance(unsigned int index) > remap_plugin_info* p = get_plugin(index); > > if (ih && p && p->fp_tsremap_delete_instance) { > - // elevate the access to read files as root if compiled with > capabilities, if not > - // change the effective user to root > - uint32_t elevate_access = 0; > - REC_ReadConfigInteger(elevate_access, > "proxy.config.plugin.load_elevated"); > - ElevateAccess access(elevate_access != 0); > p->fp_tsremap_delete_instance(ih); > - } // done elevating access > + } > } > > > > -- Igor Galić Tel: +43 (0) 664 886 22 883 Mail: i.ga...@brainsware.org URL: http://brainsware.org/ GPG: 8716 7A9F 989B ABD5 100F 4008 F266 55D6 2998 1641