summaryrefslogtreecommitdiff
path: root/debuginfod/debuginfod-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'debuginfod/debuginfod-client.c')
-rw-r--r--debuginfod/debuginfod-client.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/debuginfod/debuginfod-client.c b/debuginfod/debuginfod-client.c
index a3565f57..54dc3f2f 100644
--- a/debuginfod/debuginfod-client.c
+++ b/debuginfod/debuginfod-client.c
@@ -499,33 +499,37 @@ default_progressfn (debuginfod_client *c, long a, long b)
static size_t
header_callback (char * buffer, size_t size, size_t numitems, void * userdata)
{
+ struct handle_data *data = (struct handle_data *) userdata;
if (size != 1)
return 0;
- // X-DEBUGINFOD is 11 characters long.
+ if (data->client && data->client->verbose_fd >= 0)
+ dprintf (data->client->verbose_fd, "header %.*s", (int)numitems, buffer);
// Some basic checks to ensure the headers received are of the expected format
- if ( strncmp(buffer, "X-DEBUGINFOD", 11) || buffer[numitems-1] != '\n'
- || (buffer == strstr(buffer, ":")) ){
+ if (strncasecmp(buffer, "X-DEBUGINFOD", 11)
+ || buffer[numitems-2] != '\r'
+ || buffer[numitems-1] != '\n'
+ || (buffer == strstr(buffer, ":")) ){
return numitems;
}
/* Temporary buffer for realloc */
char *temp = NULL;
- struct handle_data *data = (struct handle_data *) userdata;
if (data->response_data == NULL)
{
- temp = malloc(numitems+1);
+ temp = malloc(numitems);
if (temp == NULL)
return 0;
}
else
{
- temp = realloc(data->response_data, data->response_data_size + numitems + 1);
+ temp = realloc(data->response_data, data->response_data_size + numitems);
if (temp == NULL)
return 0;
}
- memcpy(temp + data->response_data_size, buffer, numitems);
+ memcpy(temp + data->response_data_size, buffer, numitems-1);
data->response_data = temp;
- data->response_data_size += numitems;
+ data->response_data_size += numitems-1;
+ data->response_data[data->response_data_size-1] = '\n';
data->response_data[data->response_data_size] = '\0';
return numitems;
}
@@ -1072,11 +1076,9 @@ debuginfod_query_server (debuginfod_client *c,
int committed_to = -1;
bool verbose_reported = false;
struct timespec start_time, cur_time;
- if (c->winning_headers != NULL)
- {
- free (c->winning_headers);
- c->winning_headers = NULL;
- }
+
+ free (c->winning_headers);
+ c->winning_headers = NULL;
if ( maxtime > 0 && clock_gettime(CLOCK_MONOTONIC_RAW, &start_time) == -1)
{
rc = errno;