/** Check if the application linking to the library has the correct magic number * * @param magic number as defined by RADIUSD_MAGIC_NUMBER * @returns * - 0 on success. * - -1 on prefix mismatch. * - -2 on version mismatch. * - -3 on commit mismatch. */ int fr_check_lib_magic(uint64_t magic) { if (MAGIC_PREFIX(magic) != MAGIC_PREFIX(libmagic)) { fr_strerror_printf("Application and libfreeradius-util magic number (prefix) mismatch." " application: %x library: %x", MAGIC_PREFIX(magic), MAGIC_PREFIX(libmagic)); return -1; } if (MAGIC_VERSION(magic) != MAGIC_VERSION(libmagic)) { fr_strerror_printf("Application and libfreeradius-util magic number (version) mismatch." " application: %lx library: %lx", (unsigned long) MAGIC_VERSION(magic), (unsigned long) MAGIC_VERSION(libmagic)); return -2; } if (MAGIC_COMMIT(magic) != MAGIC_COMMIT(libmagic)) { fr_strerror_printf("Application and libfreeradius-util magic number (commit) mismatch." " application: %lx library: %lx", (unsigned long) MAGIC_COMMIT(magic), (unsigned long) MAGIC_COMMIT(libmagic)); return -3; } return 0; }
/** Check if the magic number in the module matches the one in the library * * This is used to detect potential ABI issues caused by running with modules which * were built for a different version of the server. * * @param cs being parsed. * @param module being loaded. * @returns 0 on success, -1 if prefix mismatch, -2 if version mismatch, -3 if commit mismatch. */ static int check_module_magic(CONF_SECTION *cs, module_t const *module) { if (MAGIC_PREFIX(module->magic) != MAGIC_PREFIX(RADIUSD_MAGIC_NUMBER)) { cf_log_err_cs(cs, "Application and rlm_%s magic number (prefix) mismatch." " application: %x module: %x", module->name, MAGIC_PREFIX(RADIUSD_MAGIC_NUMBER), MAGIC_PREFIX(module->magic)); return -1; } if (MAGIC_VERSION(module->magic) != MAGIC_VERSION(RADIUSD_MAGIC_NUMBER)) { cf_log_err_cs(cs, "Application and rlm_%s magic number (version) mismatch." " application: %lx module: %lx", module->name, (unsigned long) MAGIC_VERSION(RADIUSD_MAGIC_NUMBER), (unsigned long) MAGIC_VERSION(module->magic)); return -2; } if (MAGIC_COMMIT(module->magic) != MAGIC_COMMIT(RADIUSD_MAGIC_NUMBER)) { cf_log_err_cs(cs, "Application and rlm_%s magic number (commit) mismatch." " application: %lx module: %lx", module->name, (unsigned long) MAGIC_COMMIT(RADIUSD_MAGIC_NUMBER), (unsigned long) MAGIC_COMMIT(module->magic)); return -3; } return 0; }
/** Check if the magic number in the module matches the one in the library * * This is used to detect potential ABI issues caused by running with modules which * were built for a different version of the server. * * @param cs being parsed. * @param module being loaded. * @returns * - 0 on success. * - -1 if prefix mismatch. * - -2 if version mismatch. * - -3 if commit mismatch. */ static int check_module_magic(CONF_SECTION *cs, module_t const *module) { #ifdef HAVE_DLADDR Dl_info dl_info; dladdr(module, &dl_info); #endif if (MAGIC_PREFIX(module->magic) != MAGIC_PREFIX(RADIUSD_MAGIC_NUMBER)) { #ifdef HAVE_DLADDR cf_log_err_cs(cs, "Failed loading module rlm_%s from file %s", module->name, dl_info.dli_fname); #endif cf_log_err_cs(cs, "Application and rlm_%s magic number (prefix) mismatch." " application: %x module: %x", module->name, MAGIC_PREFIX(RADIUSD_MAGIC_NUMBER), MAGIC_PREFIX(module->magic)); return -1; } if (MAGIC_VERSION(module->magic) != MAGIC_VERSION(RADIUSD_MAGIC_NUMBER)) { #ifdef HAVE_DLADDR cf_log_err_cs(cs, "Failed loading module rlm_%s from file %s", module->name, dl_info.dli_fname); #endif cf_log_err_cs(cs, "Application and rlm_%s magic number (version) mismatch." " application: %lx module: %lx", module->name, (unsigned long) MAGIC_VERSION(RADIUSD_MAGIC_NUMBER), (unsigned long) MAGIC_VERSION(module->magic)); return -2; } if (MAGIC_COMMIT(module->magic) != MAGIC_COMMIT(RADIUSD_MAGIC_NUMBER)) { #ifdef HAVE_DLADDR cf_log_err_cs(cs, "Failed loading module rlm_%s from file %s", module->name, dl_info.dli_fname); #endif cf_log_err_cs(cs, "Application and rlm_%s magic number (commit) mismatch." " application: %lx module: %lx", module->name, (unsigned long) MAGIC_COMMIT(RADIUSD_MAGIC_NUMBER), (unsigned long) MAGIC_COMMIT(module->magic)); return -3; } return 0; }