X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Flookups%2Fibase.c;h=f08f503f0ea3432c43316537fbfe6d1e7695383b;hb=14e2dbbf0ec482f9fa5dd5a4fb6f2954a27f21eb;hp=acf9787a1083fb31eb230efc162a6a93f15df7e4;hpb=9242a7e8cfa94bbc9dd7eca6bd651b569b871c4e;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/lookups/ibase.c b/src/src/lookups/ibase.c index acf9787a1..f08f503f0 100644 --- a/src/src/lookups/ibase.c +++ b/src/src/lookups/ibase.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2017 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ /* The code in this module was contributed by Ard Biesheuvel. */ @@ -51,7 +51,7 @@ static void ibase_tidy(void) while ((cn = ibase_connections) != NULL) { ibase_connections = cn->next; - DEBUG(D_lookup) debug_printf("close Interbase connection: %s\n", + DEBUG(D_lookup) debug_printf_indent("close Interbase connection: %s\n", cn->server); isc_commit_transaction(status, &cn->transh); isc_detach_database(status, &cn->dbh); @@ -112,12 +112,13 @@ perform_ibase_search(uschar * query, uschar * server, uschar ** resultptr, isc_stmt_handle stmth = NULL; XSQLDA *out_sqlda; XSQLVAR *var; +int i; +rmark reset_point; char buffer[256]; ISC_STATUS status[20], *statusp = status; gstring * result; -int i; int yield = DEFER; ibase_connection *cn; uschar *server_copy = NULL; @@ -128,7 +129,7 @@ database, user, password. We can write to the string, since it is in a nextinlist temporary buffer. The copy of the string that is used for caching has the password removed. This copy is also used for debugging output. */ -for (i = 2; i > 0; i--) +for (int i = 2; i > 0; i--) { uschar *pp = Ustrrchr(server, '|'); @@ -170,14 +171,12 @@ if (cn) isc_detach_database(status, &cn->dbh); } else - { - DEBUG(D_lookup) debug_printf("Interbase using cached connection for %s\n", + DEBUG(D_lookup) debug_printf_indent("Interbase using cached connection for %s\n", server_copy); - } } else { - cn = store_get(sizeof(ibase_connection)); + cn = store_get(sizeof(ibase_connection), FALSE); cn->server = server_copy; cn->dbh = NULL; cn->transh = NULL; @@ -189,7 +188,7 @@ else if (cn->dbh == NULL || cn->transh == NULL) { - char *dpb, *p; + char *dpb; short dpb_length; static char trans_options[] = { isc_tpb_version3, isc_tpb_read, isc_tpb_read_committed, @@ -201,16 +200,16 @@ if (cn->dbh == NULL || cn->transh == NULL) *dpb++ = isc_dpb_version1; *dpb++ = isc_dpb_user_name; *dpb++ = strlen(sdata[1]); - for (p = sdata[1]; *p;) + for (char * p = sdata[1]; *p;) *dpb++ = *p++; *dpb++ = isc_dpb_password; *dpb++ = strlen(sdata[2]); - for (p = sdata[2]; *p;) + for (char * p = sdata[2]; *p;) *dpb++ = *p++; dpb_length = dpb - buffer; DEBUG(D_lookup) - debug_printf("new Interbase connection: database=%s user=%s\n", + debug_printf_indent("new Interbase connection: database=%s user=%s\n", sdata[0], sdata[1]); /* Connect to the database */ @@ -250,7 +249,9 @@ if (isc_dsql_allocate_statement(status, &cn->dbh, &stmth)) goto IBASE_EXIT; } -out_sqlda = store_get(XSQLDA_LENGTH(1)); +/* Lacking any information, assume that the data is untainted */ +reset_point = store_mark(); +out_sqlda = store_get(XSQLDA_LENGTH(1), FALSE); out_sqlda->version = SQLDA_VERSION1; out_sqlda->sqln = 1; @@ -258,7 +259,7 @@ if (isc_dsql_prepare (status, &cn->transh, &stmth, 0, query, 1, out_sqlda)) { isc_interprete(buffer, &statusp); - store_reset(out_sqlda); + reset_point = store_reset(reset_point); out_sqlda = NULL; *errmsg = string_sprintf("Interbase prepare_statement() failed: %s", @@ -270,13 +271,13 @@ if (isc_dsql_prepare /* re-allocate the output structure if there's more than one field */ if (out_sqlda->sqln < out_sqlda->sqld) { - XSQLDA *new_sqlda = store_get(XSQLDA_LENGTH(out_sqlda->sqld)); + XSQLDA *new_sqlda = store_get(XSQLDA_LENGTH(out_sqlda->sqld), FALSE); if (isc_dsql_describe (status, &stmth, out_sqlda->version, new_sqlda)) { isc_interprete(buffer, &statusp); isc_dsql_free_statement(status, &stmth, DSQL_drop); - store_reset(out_sqlda); + reset_point = store_reset(reset_point); out_sqlda = NULL; *errmsg = string_sprintf("Interbase describe_statement() failed: %s", buffer); @@ -292,46 +293,46 @@ for (i = 0, var = out_sqlda->sqlvar; i < out_sqlda->sqld; i++, var++) switch (var->sqltype & ~1) { case SQL_VARYING: - var->sqldata = CS store_get(sizeof(char) * var->sqllen + 2); + var->sqldata = CS store_get(sizeof(char) * var->sqllen + 2, FALSE); break; case SQL_TEXT: - var->sqldata = CS store_get(sizeof(char) * var->sqllen); + var->sqldata = CS store_get(sizeof(char) * var->sqllen, FALSE); break; case SQL_SHORT: - var->sqldata = CS store_get(sizeof(short)); + var->sqldata = CS store_get(sizeof(short), FALSE); break; case SQL_LONG: - var->sqldata = CS store_get(sizeof(ISC_LONG)); + var->sqldata = CS store_get(sizeof(ISC_LONG), FALSE); break; #ifdef SQL_INT64 case SQL_INT64: - var->sqldata = CS store_get(sizeof(ISC_INT64)); + var->sqldata = CS store_get(sizeof(ISC_INT64), FALSE); break; #endif case SQL_FLOAT: - var->sqldata = CS store_get(sizeof(float)); + var->sqldata = CS store_get(sizeof(float), FALSE); break; case SQL_DOUBLE: - var->sqldata = CS store_get(sizeof(double)); + var->sqldata = CS store_get(sizeof(double), FALSE); break; #ifdef SQL_TIMESTAMP case SQL_DATE: - var->sqldata = CS store_get(sizeof(ISC_QUAD)); + var->sqldata = CS store_get(sizeof(ISC_QUAD), FALSE); break; #else case SQL_TIMESTAMP: - var->sqldata = CS store_get(sizeof(ISC_TIMESTAMP)); + var->sqldata = CS store_get(sizeof(ISC_TIMESTAMP), FALSE); break; case SQL_TYPE_DATE: - var->sqldata = CS store_get(sizeof(ISC_DATE)); + var->sqldata = CS store_get(sizeof(ISC_DATE), FALSE); break; case SQL_TYPE_TIME: - var->sqldata = CS store_get(sizeof(ISC_TIME)); + var->sqldata = CS store_get(sizeof(ISC_TIME), FALSE); break; #endif } if (var->sqltype & 1) - var->sqlind = (short *) store_get(sizeof(short)); + var->sqlind = (short *) store_get(sizeof(short), FALSE); } /* finally, we're ready to execute the statement */ @@ -373,7 +374,7 @@ while (isc_dsql_fetch(status, &stmth, out_sqlda->version, out_sqlda) != 100L) } else - for (i = 0; i < out_sqlda->sqld; i++) + for (int i = 0; i < out_sqlda->sqld; i++) { int len = fetch_field(buffer, sizeof(buffer), &out_sqlda->sqlvar[i]); @@ -388,10 +389,8 @@ while (isc_dsql_fetch(status, &stmth, out_sqlda->version, out_sqlda) != 100L) else if (buffer[0] == 0 || Ustrchr(buffer, ' ') != NULL) { - int j; - result = string_catn(result, US "\"", 1); - for (j = 0; j < len; j++) + for (int j = 0; j < len; j++) { if (buffer[j] == '\"' || buffer[j] == '\\') result = string_cat(result, US "\\", 1); @@ -415,7 +414,7 @@ if (!result) *errmsg = US "Interbase: no data found"; } else - store_reset(result->s + result->ptr + 1); + gstring_release_unused(result); /* Get here by goto from various error checks. */ @@ -434,7 +433,7 @@ if (result) } else { - DEBUG(D_lookup) debug_printf("%s\n", *errmsg); + DEBUG(D_lookup) debug_printf_indent("%s\n", *errmsg); return yield; /* FAIL or DEFER */ } } @@ -462,7 +461,7 @@ ibase_find(void *handle, uschar * filename, uschar * query, int length, /* Keep picky compilers happy */ do_cache = do_cache; - DEBUG(D_lookup) debug_printf("Interbase query: %s\n", query); + DEBUG(D_lookup) debug_printf_indent("Interbase query: %s\n", query); while ((server = string_nextinlist(&list, &sep, buffer, @@ -518,7 +517,7 @@ static uschar *ibase_quote(uschar * s, uschar * opt) if (count == 0) return s; - t = quoted = store_get(Ustrlen(s) + count + 1); + t = quoted = store_get(Ustrlen(s) + count + 1, FALSE); while ((c = *s++) != 0) { if (Ustrchr("'", c) != NULL) {