doLog:
  212|      2|      ...) {
  213|      2|    FILE *logfile;
  214|      2|    if (unlikely(*status == LOGLEVEL_UNDEFINED))
  ------------------
  |  |   24|      2|#define unlikely(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (24:21): [True: 1, False: 1]
  |  |  ------------------
  ------------------
  215|      1|        *status = getLogLevel(module, logdefault);
  216|       |
  217|      2|    if (loglevel > *status)
  ------------------
  |  Branch (217:9): [True: 0, False: 2]
  ------------------
  218|      0|        return;
  219|       |
  220|      2|    int  size = snprintf(NULL, 0, "%s:%s:%s:%d:%s() %s \n", log_strings[loglevel], module, file,
  221|      2|                         line, func, msg);
  222|      2|    char fmt[size + 1];
  223|      2|    snprintf(fmt, sizeof(fmt), "%s:%s:%s:%d:%s() %s \n", log_strings[loglevel], module, file, line,
  224|      2|             func, msg);
  225|       |
  226|      2|    va_list vaargs;
  227|      2|    va_start(vaargs, msg);
  228|      2|    logfile = getLogFile();
  229|      2|    vfprintf(logfile, fmt,
  230|       |             /* log_strings[loglevel], module, file, func, line, */
  231|      2|             vaargs);
  232|      2|    fflush(logfile);
  233|       |    va_end(vaargs);
  234|      2|}
log.c:getLogFile:
   87|      2|getLogFile(void) {
   88|      2|#ifdef LOG_FILE_ENABLED
   89|      2|    const char  *envpath;
   90|      2|    static FILE *file = NULL;
   91|       |
   92|      2|    if (file) {
  ------------------
  |  Branch (92:9): [True: 1, False: 1]
  ------------------
   93|      1|        return file;
   94|      1|    }
   95|       |
   96|      1|    envpath = getenv("TSS2_LOGFILE");
   97|      1|    if (envpath == NULL || !case_insensitive_strncmp(envpath, "stderr", 7)) {
  ------------------
  |  Branch (97:9): [True: 1, False: 0]
  |  Branch (97:28): [True: 0, False: 0]
  ------------------
   98|      1|        file = stderr;
   99|      1|    } else if (!strcmp(envpath, "-") || !case_insensitive_strncmp(envpath, "stdout", 7)) {
  ------------------
  |  Branch (99:16): [True: 0, False: 0]
  |  Branch (99:41): [True: 0, False: 0]
  ------------------
  100|      0|        file = stdout;
  101|      0|    } else {
  102|      0|        file = fopen(envpath, "a+");
  103|      0|        if (file == NULL) {
  ------------------
  |  Branch (103:13): [True: 0, False: 0]
  ------------------
  104|      0|            file = stderr;
  105|      0|            fprintf(file, "Failed to open logging file %s: %s\n", envpath, strerror(errno));
  106|      0|            fflush(file);
  107|      0|        }
  108|      0|    }
  109|       |
  110|      1|    return file;
  111|       |#else
  112|       |    return stderr;
  113|       |#endif
  114|      2|}
log.c:getLogLevel:
  248|      1|getLogLevel(const char *module, log_level logdefault) {
  249|      1|    log_level   loglevel = logdefault;
  250|      1|    const char *envlevel = getenv("TSS2_LOG");
  251|      1|    const char *i = envlevel;
  252|      1|    if (envlevel == NULL)
  ------------------
  |  Branch (252:9): [True: 1, False: 0]
  ------------------
  253|      1|        return loglevel;
  254|      0|    while ((i = strchr(i, '+')) != NULL) {
  ------------------
  |  Branch (254:12): [True: 0, False: 0]
  ------------------
  255|      0|        if ((envlevel <= i - strlen("all") && case_insensitive_strncmp(i - 3, "all", 3) == 0)
  ------------------
  |  Branch (255:14): [True: 0, False: 0]
  |  Branch (255:47): [True: 0, False: 0]
  ------------------
  256|      0|            || (envlevel <= i - strlen(module)
  ------------------
  |  Branch (256:17): [True: 0, False: 0]
  ------------------
  257|      0|                && case_insensitive_strncmp(i - strlen(module), module, strlen(module)) == 0)) {
  ------------------
  |  Branch (257:20): [True: 0, False: 0]
  ------------------
  258|      0|            log_level tmp = log_stringlevel(i + 1);
  259|      0|            if (tmp != LOGLEVEL_UNDEFINED)
  ------------------
  |  Branch (259:17): [True: 0, False: 0]
  ------------------
  260|      0|                loglevel = tmp;
  261|      0|        }
  262|      0|        i = i + 1;
  263|      0|    }
  264|      0|    return loglevel;
  265|      1|}

LLVMFuzzerTestOneInput:
   25|      2|LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
   26|      2|    TSS2_TEST_SYS_CONTEXT     *test_sys_ctx;
   27|      2|    TSS2_TCTI_FUZZING_CONTEXT *tcti_fuzzing = NULL;
   28|      2|    TSS2_RC                    rc;
   29|      2|    int                        ret;
   30|       |
   31|      2|    ret = test_sys_setup(&test_sys_ctx);
   32|      2|    if (ret != 0) {
  ------------------
  |  Branch (32:9): [True: 2, False: 0]
  ------------------
   33|      2|        return ret;
   34|      2|    }
   35|       |
   36|      0|    ret = test_sys_checks_pre(test_sys_ctx);
   37|      0|    if (ret != 0) {
  ------------------
  |  Branch (37:9): [True: 0, False: 0]
  ------------------
   38|      0|        return ret;
   39|      0|    }
   40|       |
   41|      0|    tcti_fuzzing = tcti_fuzzing_context_cast(test_sys_ctx->tcti_ctx);
   42|      0|    tcti_fuzzing->data = Data;
   43|      0|    tcti_fuzzing->size = Size;
   44|       |
   45|      0|    rc = test_invoke(test_sys_ctx->sys_ctx);
   46|      0|    if (rc != 0 && ret != 77) {
  ------------------
  |  Branch (46:9): [True: 0, False: 0]
  |  Branch (46:20): [True: 0, False: 0]
  ------------------
   47|      0|        LOG_ERROR("Test returned %08x", rc);
  ------------------
  |  |   67|      0|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      0|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      0|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      0|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
   48|      0|        exit(1);
   49|      0|    }
   50|       |
   51|      0|    ret = test_sys_checks_post(test_sys_ctx);
   52|      0|    if (ret != 0) {
  ------------------
  |  Branch (52:9): [True: 0, False: 0]
  ------------------
   53|      0|        exit(1);
   54|      0|    }
   55|       |
   56|      0|    test_sys_teardown(test_sys_ctx);
   57|       |
   58|      0|    return 0; // Non-zero return values are reserved for future use.
   59|      0|}

test_sys_setup:
  305|      2|test_sys_setup(TSS2_TEST_SYS_CONTEXT **test_ctx) {
  306|      2|    TSS2_RC          rc;
  307|      2|    TSS2_ABI_VERSION abi_version = TEST_ABI_VERSION;
  ------------------
  |  |   23|      2|    {                                                                                              \
  |  |   24|      2|        .tssCreator = TSSWG_INTEROP, .tssFamily = TSS_SYS_FIRST_FAMILY,                            \
  |  |  ------------------
  |  |  |  |   17|      2|#define TSSWG_INTEROP         1
  |  |  ------------------
  |  |                       .tssCreator = TSSWG_INTEROP, .tssFamily = TSS_SYS_FIRST_FAMILY,                            \
  |  |  ------------------
  |  |  |  |   18|      2|#define TSS_SYS_FIRST_FAMILY  2
  |  |  ------------------
  |  |   25|      2|        .tssLevel = TSS_SYS_FIRST_LEVEL, .tssVersion = TSS_SYS_FIRST_VERSION,                      \
  |  |  ------------------
  |  |  |  |   19|      2|#define TSS_SYS_FIRST_LEVEL   1
  |  |  ------------------
  |  |                       .tssLevel = TSS_SYS_FIRST_LEVEL, .tssVersion = TSS_SYS_FIRST_VERSION,                      \
  |  |  ------------------
  |  |  |  |   20|      2|#define TSS_SYS_FIRST_VERSION 108
  |  |  ------------------
  |  |   26|      2|    }
  ------------------
  308|      2|    size_t           size;
  309|      2|    char            *name_conf;
  310|       |
  311|      2|    size = sizeof(TSS2_TEST_SYS_CONTEXT);
  312|      2|    *test_ctx = malloc(size);
  313|      2|    if (test_ctx == NULL) {
  ------------------
  |  Branch (313:9): [True: 0, False: 2]
  ------------------
  314|      0|        LOG_ERROR("Failed to allocate 0x%zx bytes for the test context", size);
  ------------------
  |  |   67|      0|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      0|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      0|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      0|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
  315|      0|        goto fail;
  316|      0|    }
  317|       |
  318|      2|    name_conf = getenv(ENV_TCTI); // TODO arg, then env?
  ------------------
  |  |   15|      2|#define ENV_TCTI              "TPM20TEST_TCTI"
  ------------------
  319|      2|    if (!name_conf) {
  ------------------
  |  Branch (319:9): [True: 2, False: 0]
  ------------------
  320|      2|        LOG_ERROR("TCTI module not specified. Use environment variable: " ENV_TCTI);
  ------------------
  |  |   67|      2|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      2|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      2|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      2|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
  321|      2|        goto cleanup_test_ctx;
  322|      2|    }
  323|       |
  324|      0|    rc = Tss2_TctiLdr_Initialize(name_conf, &(*test_ctx)->tcti_ctx);
  325|      0|    if (rc != TSS2_RC_SUCCESS) {
  ------------------
  |  |  145|      0|#define TSS2_RC_SUCCESS ((TSS2_RC)0)
  ------------------
  |  Branch (325:9): [True: 0, False: 0]
  ------------------
  326|      0|        LOG_ERROR("Error loading TCTI: %s", name_conf);
  ------------------
  |  |   67|      0|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      0|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      0|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      0|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
  327|      0|        goto cleanup_test_ctx;
  328|      0|    }
  329|       |
  330|      0|    size = Tss2_Sys_GetContextSize(0);
  331|      0|    (*test_ctx)->sys_ctx = malloc(size);
  332|      0|    if ((*test_ctx)->sys_ctx == NULL) {
  ------------------
  |  Branch (332:9): [True: 0, False: 0]
  ------------------
  333|      0|        LOG_ERROR("Failed to allocate 0x%zx bytes for the System API context", size);
  ------------------
  |  |   67|      0|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      0|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      0|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      0|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
  334|      0|        goto cleanup_tcti_ctx;
  335|      0|    }
  336|      0|    rc = Tss2_Sys_Initialize((*test_ctx)->sys_ctx, size, (*test_ctx)->tcti_ctx, &abi_version);
  337|      0|    if (rc != TSS2_RC_SUCCESS) {
  ------------------
  |  |  145|      0|#define TSS2_RC_SUCCESS ((TSS2_RC)0)
  ------------------
  |  Branch (337:9): [True: 0, False: 0]
  ------------------
  338|      0|        LOG_ERROR("Failed to initialize System API context: 0x%x", rc);
  ------------------
  |  |   67|      0|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      0|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      0|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      0|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
  339|      0|        goto cleanup_sys_mem;
  340|      0|    }
  341|       |
  342|      0|    rc = Tss2_Sys_Startup((*test_ctx)->sys_ctx, TPM2_SU_CLEAR);
  ------------------
  |  |  644|      0|    ((TPM2_SU)0x0000) /* On TPM2_Shutdown indicates that the TPM should prepare for loss of power  \
  ------------------
  343|      0|    if (rc != TSS2_RC_SUCCESS && rc != TPM2_RC_INITIALIZE) {
  ------------------
  |  |  145|      0|#define TSS2_RC_SUCCESS ((TSS2_RC)0)
  ------------------
                  if (rc != TSS2_RC_SUCCESS && rc != TPM2_RC_INITIALIZE) {
  ------------------
  |  |  285|      0|    ((TPM2_RC)(TPM2_RC_VER1                                                                        \
  |  |  ------------------
  |  |  |  |  283|      0|#define TPM2_RC_VER1    ((TPM2_RC)0x100) /* set for all format 0 response codes */
  |  |  ------------------
  |  |  286|      0|               + 0x000)) /* TPM not initialized by TPM2_Startup or already initialized */
  ------------------
  |  Branch (343:9): [True: 0, False: 0]
  |  Branch (343:34): [True: 0, False: 0]
  ------------------
  344|      0|        LOG_ERROR("TPM2_Startup failed: 0x%" PRIx32, rc);
  ------------------
  |  |   67|      0|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      0|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      0|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      0|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
  345|      0|        goto cleanup_sys_ctx;
  346|      0|    }
  347|       |
  348|      0|    (*test_ctx)->tpm_state = malloc(sizeof(tpm_state));
  349|      0|    if (test_ctx == NULL) {
  ------------------
  |  Branch (349:9): [True: 0, False: 0]
  ------------------
  350|      0|        LOG_ERROR("Failed to allocate 0x%zx bytes for tpm_state.", size);
  ------------------
  |  |   67|      0|    doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   49|      0|#define xstr(s) str(s)
  |  |  |  |  ------------------
  |  |  |  |  |  |   50|      0|#define str(s)  #s
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   doLog(LOGLEVEL_ERROR, xstr(LOGMODULE), LOGDEFAULT, &LOGMODULE_status, __FILE__, __func__,      \
  |  |  ------------------
  |  |  |  |   28|      0|#define LOGDEFAULT LOGLEVEL_WARNING
  |  |  ------------------
  |  |   68|       |          __LINE__, FORMAT, ##__VA_ARGS__)
  ------------------
  351|      0|        goto cleanup_sys_ctx;
  352|      0|    }
  353|       |
  354|      0|    return TPM2_RC_SUCCESS;
  ------------------
  |  |  281|      0|#define TPM2_RC_SUCCESS ((TPM2_RC)0x000)
  ------------------
  355|       |
  356|      0|    free((*test_ctx)->tpm_state);
  357|       |
  358|      0|cleanup_sys_ctx:
  359|      0|    Tss2_Sys_Finalize((*test_ctx)->sys_ctx);
  360|       |
  361|      0|cleanup_sys_mem:
  362|      0|    free((*test_ctx)->sys_ctx);
  363|       |
  364|      0|cleanup_tcti_ctx:
  365|      0|    Tss2_TctiLdr_Finalize(&(*test_ctx)->tcti_ctx);
  366|       |
  367|      2|cleanup_test_ctx:
  368|      2|    free(*test_ctx);
  369|       |
  370|      2|fail:
  371|      2|    return EXIT_ERROR;
  ------------------
  |  |   29|      2|#define EXIT_ERROR 99
  ------------------
  372|      2|}

