You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.1 KiB
110 lines
3.1 KiB
// Copyright 2020 Google LLC
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "access/xlog.h"
|
|
#include "access/xact.h"
|
|
#include "common/username.h"
|
|
#include "executor/spi.h"
|
|
#include "jit/jit.h"
|
|
#include "libpq/libpq.h"
|
|
#include "libpq/pqsignal.h"
|
|
#include "miscadmin.h"
|
|
#include "optimizer/optimizer.h"
|
|
#include "parser/analyze.h"
|
|
#include "parser/parser.h"
|
|
#include "storage/proc.h"
|
|
#include "tcop/tcopprot.h"
|
|
#include "utils/datetime.h"
|
|
#include "utils/memutils.h"
|
|
#include "utils/portal.h"
|
|
#include "utils/snapmgr.h"
|
|
#include "utils/timeout.h"
|
|
|
|
#include <libgen.h>
|
|
|
|
const char *progname;
|
|
static MemoryContext row_description_context = NULL;
|
|
static StringInfoData row_description_buf;
|
|
static const char *username = "username";
|
|
|
|
int FuzzerInitialize(char *dbname, char ***argv){
|
|
char *av[5];
|
|
char arg_path[50];
|
|
char path_to_db[50];
|
|
char untar[100];
|
|
char *exe_path = (*argv)[0];
|
|
//dirname() can modify its argument
|
|
char *exe_path_copy = strdup(exe_path);
|
|
char *dir = dirname(exe_path_copy);
|
|
chdir(dir);
|
|
free(exe_path_copy);
|
|
|
|
snprintf(arg_path, sizeof(arg_path), "/tmp/%s/data", dbname);
|
|
snprintf(path_to_db, sizeof(path_to_db), "-D\"/tmp/%s/data\"", dbname);
|
|
snprintf(untar, sizeof(untar), "rm -rf /tmp/%s; mkdir /tmp/%s; cp -r data /tmp/%s", dbname, dbname, dbname);
|
|
|
|
av[0] = "tmp_install/usr/local/pgsql/bin/postgres";
|
|
av[1] = path_to_db;
|
|
av[2] = "-F";
|
|
av[3] = "-k\"/tmp\"";
|
|
av[4] = NULL;
|
|
|
|
system(untar);
|
|
|
|
progname = get_progname(av[0]);
|
|
MemoryContextInit();
|
|
|
|
InitStandaloneProcess(av[0]);
|
|
SetProcessingMode(InitProcessing);
|
|
InitializeGUCOptions();
|
|
process_postgres_switches(4, av, PGC_POSTMASTER, NULL);
|
|
|
|
SelectConfigFiles(arg_path, progname);
|
|
|
|
checkDataDir();
|
|
ChangeToDataDir();
|
|
CreateDataDirLockFile(false);
|
|
LocalProcessControlFile(false);
|
|
InitializeMaxBackends();
|
|
|
|
BaseInit();
|
|
InitProcess();
|
|
PG_SETMASK(&UnBlockSig);
|
|
InitPostgres("dbfuzz", InvalidOid, username, InvalidOid, NULL, false);
|
|
|
|
SetProcessingMode(NormalProcessing);
|
|
|
|
BeginReportingGUCOptions();
|
|
process_session_preload_libraries();
|
|
|
|
MessageContext = AllocSetContextCreate(TopMemoryContext,
|
|
"MessageContext",
|
|
ALLOCSET_DEFAULT_SIZES);
|
|
row_description_context = AllocSetContextCreate(TopMemoryContext,
|
|
"RowDescriptionContext",
|
|
ALLOCSET_DEFAULT_SIZES);
|
|
MemoryContextSwitchTo(row_description_context);
|
|
initStringInfo(&row_description_buf);
|
|
MemoryContextSwitchTo(TopMemoryContext);
|
|
|
|
PgStartTime = GetCurrentTimestamp();
|
|
whereToSendOutput = DestNone;
|
|
Log_destination = 0;
|
|
return 0;
|
|
}
|