diff --git a/medmysql.c b/medmysql.c index 62ee4e4..178f85c 100644 --- a/medmysql.c +++ b/medmysql.c @@ -409,13 +409,16 @@ void medmysql_cleanup() medmysql_handler_close(&stats_handler); } +#define BUFPRINT(x...) buflen += sprintf(sql_buffer + buflen, x); if (buflen >= sql_buffer_size) abort() +#define BUFESCAPE(x) buflen += mysql_real_escape_string(med_handler->m, sql_buffer + buflen, x, strlen(x)); if (buflen >= sql_buffer_size) abort() + /**********************************************************************/ int medmysql_insert_records(med_entry_t *records, uint64_t count, const char *table) { char *sql_buffer = NULL; size_t sql_buffer_size = (count + 1) * 1024; // some extra space for sql overhead - char entry_buffer[1024]; - int ret; + size_t buflen = 0; + int ret, entries = 0; if (!count) return 0; @@ -425,8 +428,7 @@ int medmysql_insert_records(med_entry_t *records, uint64_t count, const char *ta L_ERROR("Failed to allocate memory for redis cleanup sql buffer\n"); return -1; } - memset(sql_buffer, 0, sql_buffer_size); - snprintf(sql_buffer, sql_buffer_size, "INSERT INTO kamailio.acc_%s " \ + BUFPRINT("INSERT INTO kamailio.acc_%s " \ "(sip_code,sip_reason,method,callid,time,time_hires,src_leg,dst_leg) VALUES ", table); @@ -437,21 +439,39 @@ int medmysql_insert_records(med_entry_t *records, uint64_t count, const char *ta if (!e->redis) continue; - snprintf(entry_buffer, sizeof(entry_buffer), "('%s','%s','%s','%s','%s','%f','%s','%s'),", - e->sip_code, e->sip_reason, e->sip_method, e->callid, e->timestamp, e->unix_timestamp, e->src_leg, e->dst_leg); - sql_buffer = strcat(sql_buffer, entry_buffer); + BUFPRINT("('"); + BUFESCAPE(e->sip_code); + BUFPRINT("','"); + BUFESCAPE(e->sip_reason); + BUFPRINT("','"); + BUFESCAPE(e->sip_method); + BUFPRINT("','"); + BUFESCAPE(e->callid); + BUFPRINT("','"); + BUFESCAPE(e->timestamp); + BUFPRINT("','%f','", e->unix_timestamp); + BUFESCAPE(e->src_leg); + BUFPRINT("','"); + BUFESCAPE(e->dst_leg); + BUFPRINT("'),"); + + entries++; } - sql_buffer[strlen(sql_buffer)-1] = '\0'; + if (!entries) + goto out; + + sql_buffer[--buflen] = '\0'; L_DEBUG("Issuing record insert query: %s\n", sql_buffer); - ret = medmysql_query_wrapper(med_handler, sql_buffer, strlen(sql_buffer)); + ret = medmysql_query_wrapper(med_handler, sql_buffer, buflen); if (ret != 0) { L_ERROR("Error executing query '%s': %s", sql_buffer, mysql_error(med_handler->m)); } +out: free(sql_buffer); return ret; }