static ib_status_t geoip_database_file_dir_param1(ib_cfgparser_t *cp, const char *name, const char *p1, void *cbdata) { IB_FTRACE_INIT(); assert(cp!=NULL); assert(name!=NULL); assert(p1!=NULL); ib_status_t rc; size_t p1_len = strlen(p1); size_t p1_unescaped_len; char *p1_unescaped = malloc(p1_len+1); if ( p1_unescaped == NULL ) { IB_FTRACE_RET_STATUS(IB_EALLOC); } rc = ib_util_unescape_string(p1_unescaped, &p1_unescaped_len, p1, p1_len, IB_UTIL_UNESCAPE_NULTERMINATE | IB_UTIL_UNESCAPE_NONULL); if (rc != IB_OK ) { const char *msg = ( rc == IB_EBADVAL )? "GeoIP Database File \"%s\" contains nulls." : "GeoIP Database File \"%s\" is an invalid string."; ib_log_debug(cp->ib, msg, p1); free(p1_unescaped); IB_FTRACE_RET_STATUS(rc); } if (geoip_db != NULL) { GeoIP_delete(geoip_db); geoip_db = NULL; } IB_FTRACE_MSG("Initializing custom GeoIP database..."); IB_FTRACE_MSG(p1_unescaped); geoip_db = GeoIP_open(p1_unescaped, GEOIP_MMAP_CACHE); free(p1_unescaped); if (geoip_db == NULL) { IB_FTRACE_MSG("Failed to initialize GeoIP database."); IB_FTRACE_RET_STATUS(IB_EUNKNOWN); } IB_FTRACE_RET_STATUS(IB_OK); }
TEST(TestIBUtilUnescapeString, shortSingleBytes) { const char *str = "\\x0\\x00"; char str2[3]; size_t len; ASSERT_EQ(IB_EINVAL, ib_util_unescape_string(str2, &len, str, strlen(str), IB_UTIL_UNESCAPE_NULTERMINATE)); }
TEST(TestIBUtilUnescapeString, shortLongBytesEndOfLine) { const char *str = "\\u0001\\u431"; char str2[5]; size_t len; ASSERT_EQ(IB_EINVAL, ib_util_unescape_string(str2, &len, str, strlen(str), IB_UTIL_UNESCAPE_NULTERMINATE)); }
TEST(TestIBUtilUnescapeString, removesQuotes) { const char *src = "\\\"hi\\\'"; char dst[5]; size_t len; ASSERT_EQ(IB_OK, ib_util_unescape_string(dst, &len, src, strlen(src), IB_UTIL_UNESCAPE_NULTERMINATE)); ASSERT_STREQ("\"hi\'", dst); }
TEST(TestIBUtilUnescapeString, nochange01) { const char* str = "LoadModule"; char str2[100]; size_t len; ASSERT_EQ(IB_OK, ib_util_unescape_string(str2, &len, str, strlen(str), IB_UTIL_UNESCAPE_NULTERMINATE)); ASSERT_EQ(0, strcmp(str, str2)); }
static ib_status_t geoip_database_file_dir_param1(ib_cfgparser_t *cp, const char *name, const char *p1, void *cbdata) { assert(cp!=NULL); assert(name!=NULL); assert(p1!=NULL); ib_status_t rc; size_t p1_len = strlen(p1); size_t p1_unescaped_len; char *p1_unescaped = malloc(p1_len+1); if ( p1_unescaped == NULL ) { return IB_EALLOC; } rc = ib_util_unescape_string(p1_unescaped, &p1_unescaped_len, p1, p1_len, IB_UTIL_UNESCAPE_NULTERMINATE | IB_UTIL_UNESCAPE_NONULL); if (rc != IB_OK ) { const char *msg = ( rc == IB_EBADVAL )? "GeoIP Database File \"%s\" contains nulls." : "GeoIP Database File \"%s\" is an invalid string."; ib_log_debug(cp->ib, msg, p1); free(p1_unescaped); return rc; } if (geoip_db != NULL) { GeoIP_delete(geoip_db); geoip_db = NULL; } geoip_db = GeoIP_open(p1_unescaped, GEOIP_MMAP_CACHE); free(p1_unescaped); if (geoip_db == NULL) { return IB_EUNKNOWN; } return IB_OK; }
TEST(TestIBUtilUnescapeString, singleBytes) { const char *str = "\\x01\\x02"; char str2[3]; char chk[2] = { 1, 2 }; size_t len; ASSERT_EQ(IB_OK, ib_util_unescape_string(str2, &len, str, strlen(str), IB_UTIL_UNESCAPE_NULTERMINATE)); EXPECT_EQ(chk[0], str2[0]); EXPECT_EQ(chk[1], str2[1]); EXPECT_EQ('\0', str2[2]); EXPECT_EQ(2UL, len); }
TEST(TestIBUtilUnescapeString, singleCharacter) { char str[7] = "\\r\\n\\t"; char str2[4]; size_t len; ASSERT_EQ(IB_OK, ib_util_unescape_string(str2, &len, str, strlen(str), IB_UTIL_UNESCAPE_NULTERMINATE)); EXPECT_EQ('\r', str2[0]); EXPECT_EQ('\n', str2[1]); EXPECT_EQ('\t', str2[2]); EXPECT_EQ('\0', str2[3]); ASSERT_EQ(3UL, len); }
TEST(TestIBUtilUnescapeString, longBytes) { const char *str = "\\u0001\\u4321"; char str2[5]; char chk[4] = { 0, 1, 67, 33 }; size_t len; ASSERT_EQ(IB_OK, ib_util_unescape_string(str2, &len, str, strlen(str), IB_UTIL_UNESCAPE_NULTERMINATE)); EXPECT_EQ(chk[0], str2[0]); EXPECT_EQ(chk[1], str2[1]); EXPECT_EQ(chk[2], str2[2]); EXPECT_EQ(chk[3], str2[3]); EXPECT_EQ('\0', str2[4]); EXPECT_EQ(4UL, len); }
TEST(TestIBUtilUnescapeString, nullsInString) { const char *src1 = "hi\\x00hello"; const char *src2 = "hi\\u0000hello"; const char *src3 = "hi\\u0100hello"; const char *src4 = "hi\\u0001hello"; char dst[10]; size_t len; /* \u0000 test. */ ASSERT_EQ(IB_OK, ib_util_unescape_string(dst, &len, src1, strlen(src1), IB_UTIL_UNESCAPE_NULTERMINATE)); ASSERT_STREQ("hi", dst); ASSERT_STREQ("hello", dst+3); ASSERT_EQ(IB_EBADVAL, ib_util_unescape_string(dst, &len, src1, strlen(src1), IB_UTIL_UNESCAPE_NONULL | IB_UTIL_UNESCAPE_NULTERMINATE)); /* \x00 test. */ ASSERT_EQ(IB_OK, ib_util_unescape_string(dst, &len, src2, strlen(src2), IB_UTIL_UNESCAPE_NULTERMINATE)); ASSERT_STREQ("hi", dst); ASSERT_STREQ("hello", dst+4); ASSERT_EQ(IB_EBADVAL, ib_util_unescape_string(dst, &len, src2, strlen(src2), IB_UTIL_UNESCAPE_NONULL | IB_UTIL_UNESCAPE_NULTERMINATE)); ASSERT_EQ(IB_EBADVAL, ib_util_unescape_string(dst, &len, src3, strlen(src3), IB_UTIL_UNESCAPE_NONULL | IB_UTIL_UNESCAPE_NULTERMINATE)); ASSERT_EQ(IB_EBADVAL, ib_util_unescape_string(dst, &len, src4, strlen(src4), IB_UTIL_UNESCAPE_NONULL | IB_UTIL_UNESCAPE_NULTERMINATE)); }
/** * Handle a GeoIPDatabaseFile directive. * * @param[in] cp Configuration parser * @param[in] name The directive name. * @param[in] p1 The directive parameter. * @param[in] cbdata User data (module configuration) */ static ib_status_t geoip_database_file_dir_param1(ib_cfgparser_t *cp, const char *name, const char *p1, void *cbdata) { assert(cp != NULL); assert(name != NULL); assert(p1 != NULL); assert(cbdata != NULL); ib_status_t rc; size_t p1_len = strlen(p1); size_t p1_unescaped_len; char *p1_unescaped = malloc(p1_len+1); module_data_t *mod_data = (module_data_t *)cbdata; if (p1_unescaped == NULL) { return IB_EALLOC; } rc = ib_util_unescape_string(p1_unescaped, &p1_unescaped_len, p1, p1_len, IB_UTIL_UNESCAPE_NULTERMINATE | IB_UTIL_UNESCAPE_NONULL); if (rc != IB_OK ) { const char *msg = ( rc == IB_EBADVAL )? "GeoIP Database File \"%s\" contains nulls." : "GeoIP Database File \"%s\" is an invalid string."; ib_cfg_log_debug(cp, msg, p1); free(p1_unescaped); return rc; } if (mod_data->geoip_db != NULL) { GeoIP_delete(mod_data->geoip_db); mod_data->geoip_db = NULL; } mod_data->geoip_db = GeoIP_open(p1_unescaped, GEOIP_MMAP_CACHE); if (mod_data->geoip_db == NULL) { int status = access(p1_unescaped, R_OK); if (status != 0) { ib_cfg_log_error(cp, "Unable to read GeoIP database file \"%s\"", p1_unescaped); rc = IB_ENOENT; } else { ib_cfg_log_error(cp, "Unknown error opening GeoIP database file \"%s\"", p1_unescaped); rc = IB_EUNKNOWN; } } free(p1_unescaped); return rc; }