예제 #1
0
파일: geoip.c 프로젝트: loveshell/ironbee
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);
}
예제 #2
0
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));
}
예제 #3
0
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));
}
예제 #4
0
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);
}
예제 #5
0
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));
}
예제 #6
0
파일: geoip.c 프로젝트: chiehwen/ironbee
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;
}
예제 #7
0
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);
}
예제 #8
0
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);
}
예제 #9
0
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);
}
예제 #10
0
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));
}
예제 #11
0
파일: geoip.c 프로젝트: poona/ironbee
/**
 * 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;
}