Fix defer_write when deferred_data != begin_deferred_data

I think this currently never happens, but let's
not wait until it starts happening and blows up.
This commit is contained in:
Oleg Oshmyan 2017-09-09 15:43:11 +03:00
parent b7fafb5039
commit 60b11e4964

View File

@ -6,6 +6,7 @@
#define SYSLOG_NAMES #define SYSLOG_NAMES
#define _GNU_SOURCE #define _GNU_SOURCE
#include <stddef.h>
#include <stdarg.h> #include <stdarg.h>
#include <grp.h> #include <grp.h>
@ -285,17 +286,19 @@ int connect_addr(struct connection *cnx, int fd_from)
int defer_write(struct queue *q, void* data, int data_size) int defer_write(struct queue *q, void* data, int data_size)
{ {
char *p; char *p;
ptrdiff_t data_offset = q->deferred_data - q->begin_deferred_data;
if (verbose) if (verbose)
fprintf(stderr, "**** writing deferred on fd %d\n", q->fd); fprintf(stderr, "**** writing deferred on fd %d\n", q->fd);
p = realloc(q->begin_deferred_data, q->deferred_data_size + data_size); p = realloc(q->begin_deferred_data, data_offset + q->deferred_data_size + data_size);
if (!p) { if (!p) {
perror("realloc"); perror("realloc");
exit(1); exit(1);
} }
q->deferred_data = q->begin_deferred_data = p; q->begin_deferred_data = p;
p += q->deferred_data_size; q->deferred_data = p + data_offset;
p += data_offset + q->deferred_data_size;
q->deferred_data_size += data_size; q->deferred_data_size += data_size;
memcpy(p, data, data_size); memcpy(p, data, data_size);