diff --git a/src/datasets.c b/src/datasets.c index b2f68e8bcb..2da5db1b51 100644 --- a/src/datasets.c +++ b/src/datasets.c @@ -148,8 +148,12 @@ static int DatasetLoadMd5(Dataset *set) return 0; SCLogConfig("dataset: %s loading from '%s'", set->name, set->load); + const char *fopen_mode = "r"; + if (strlen(set->save) > 0 && strcmp(set->save, set->load) == 0) { + fopen_mode = "a+"; + } - FILE *fp = fopen(set->load, "r"); + FILE *fp = fopen(set->load, fopen_mode); if (fp == NULL) { SCLogError(SC_ERR_DATASET, "fopen '%s' failed: %s", set->load, strerror(errno)); @@ -213,8 +217,12 @@ static int DatasetLoadSha256(Dataset *set) return 0; SCLogConfig("dataset: %s loading from '%s'", set->name, set->load); + const char *fopen_mode = "r"; + if (strlen(set->save) > 0 && strcmp(set->save, set->load) == 0) { + fopen_mode = "a+"; + } - FILE *fp = fopen(set->load, "r"); + FILE *fp = fopen(set->load, fopen_mode); if (fp == NULL) { SCLogError(SC_ERR_DATASET, "fopen '%s' failed: %s", set->load, strerror(errno)); @@ -274,8 +282,12 @@ static int DatasetLoadString(Dataset *set) return 0; SCLogConfig("dataset: %s loading from '%s'", set->name, set->load); + const char *fopen_mode = "r"; + if (strlen(set->save) > 0 && strcmp(set->save, set->load) == 0) { + fopen_mode = "a+"; + } - FILE *fp = fopen(set->load, "r"); + FILE *fp = fopen(set->load, fopen_mode); if (fp == NULL) { SCLogError(SC_ERR_DATASET, "fopen '%s' failed: %s", set->load, strerror(errno)); diff --git a/src/detect-dataset.c b/src/detect-dataset.c index c3413b857d..a696c07497 100644 --- a/src/detect-dataset.c +++ b/src/detect-dataset.c @@ -362,6 +362,13 @@ int DetectDatasetSetup (DetectEngineCtx *de_ctx, Signature *s, const char *rawst } else if (strlen(save) != 0 && strlen(load) == 0) { if (SetupSavePath(de_ctx, save, sizeof(save)) != 0) return -1; + /* use 'save' logic for 'state', but put the resulting + * path into 'load' as well. */ + } else if (strlen(save) != 0 && strlen(load) != 0 && + strcmp(save, load) == 0) { + if (SetupSavePath(de_ctx, save, sizeof(save)) != 0) + return -1; + strlcpy(load, save, sizeof(load)); } SCLogDebug("name '%s' load '%s' save '%s'", name, load, save);