Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

in_splunk: fix realloc with a handler to map parser references #9925

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 60 additions & 6 deletions plugins/in_splunk/splunk_conn.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,71 @@
static void splunk_conn_request_init(struct mk_http_session *session,
struct mk_http_request *request);

static void check_and_reassign_ptr(char **ptr, const char *old, char *new)
{
if (ptr == NULL) {
return;
}

if (*ptr == NULL) {
return;
}

*ptr = new + (*ptr - old);
}
static int splunk_conn_realloc(struct flb_splunk *ctx,
struct splunk_conn *conn,
size_t size)
{
char *tmp;
int idx;
struct mk_http_header *header;

tmp = flb_realloc(conn->buf_data, size);
if (!tmp) {
flb_errno();
return -1;
}
flb_plg_trace(ctx->ins, "buffer realloc %i -> %zu",
conn->buf_size, size);

check_and_reassign_ptr(&conn->request.method_p.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.uri.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.uri_processed.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.protocol_p.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.body.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request._content_length.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.content_type.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.connection.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.host.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.host_port.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.if_modified_since.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.last_modified_since.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.range.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.data.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.real_path.data, conn->buf_data, tmp);
check_and_reassign_ptr(&conn->request.query_string.data, conn->buf_data, tmp);

for (idx = conn->session.parser.header_min; idx <= conn->session.parser.header_max && idx >= 0; idx++) {
header = &conn->session.parser.headers[idx];

check_and_reassign_ptr(&header->key.data, conn->buf_data, tmp);
check_and_reassign_ptr(&header->val.data, conn->buf_data, tmp);
}

conn->buf_data = tmp;
conn->buf_size = size;

return 0;
}

static int splunk_conn_event(void *data)
{
int ret;
int status;
size_t size;
ssize_t available;
ssize_t bytes;
char *tmp;
size_t request_len;
struct flb_connection *connection;
struct splunk_conn *conn;
Expand All @@ -61,24 +118,21 @@ static int splunk_conn_event(void *data)
}

size = conn->buf_size + ctx->buffer_chunk_size;
tmp = flb_realloc(conn->buf_data, size);
if (!tmp) {
if (splunk_conn_realloc(ctx, conn, size) == -1) {
flb_errno();
return -1;
}

flb_plg_trace(ctx->ins, "fd=%i buffer realloc %i -> %zu",
event->fd, conn->buf_size, size);

conn->buf_data = tmp;
conn->buf_size = size;
available = (conn->buf_size - conn->buf_len) - 1;
}

/* Read data */
bytes = flb_io_net_read(connection,
(void *) &conn->buf_data[conn->buf_len],
available);

if (bytes <= 0) {
flb_plg_trace(ctx->ins, "fd=%i closed connection", event->fd);
splunk_conn_del(conn);
Expand Down
Loading