function sf_serializer_read_message changed
parent
320f344b3e
commit
15fc77703a
|
|
@ -473,47 +473,49 @@ const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it)
|
||||||
return &it->field;
|
return &it->field;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sf_serializer_read_message(int fd, char *buff, const int size)
|
int sf_serializer_read_message(int fd, BufferInfo *buffer,
|
||||||
|
const int max_size)
|
||||||
{
|
{
|
||||||
SFSerializerPackHeader *header;
|
SFSerializerPackHeader *header;
|
||||||
|
char *new_buff;
|
||||||
|
int new_alloc;
|
||||||
int length;
|
int length;
|
||||||
int total_bytes;
|
int total_bytes;
|
||||||
|
|
||||||
if (size <= sizeof(SFSerializerPackHeader)) {
|
if (fc_safe_read(fd, buffer->buff, sizeof(*header)) != sizeof(*header)) {
|
||||||
errno = EOVERFLOW;
|
return ENODATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fc_safe_read(fd, buff, sizeof(SFSerializerPackHeader)) !=
|
header = (SFSerializerPackHeader *)buffer->buff;
|
||||||
sizeof(SFSerializerPackHeader))
|
|
||||||
{
|
|
||||||
if (errno == 0) {
|
|
||||||
errno = ENODATA;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
header = (SFSerializerPackHeader *)buff;
|
|
||||||
length = buff2int(header->length);
|
length = buff2int(header->length);
|
||||||
if (length <= 0) {
|
if (length <= 0 || length > max_size) {
|
||||||
errno = EINVAL;
|
return EINVAL;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
total_bytes = sizeof(SFSerializerPackHeader) + length;
|
total_bytes = sizeof(*header) + length;
|
||||||
if (total_bytes > size) {
|
if (buffer->alloc_size < total_bytes) {
|
||||||
errno = EOVERFLOW;
|
new_alloc = buffer->alloc_size * 2;
|
||||||
return -1;
|
while (new_alloc < total_bytes) {
|
||||||
|
new_alloc *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_buff = (char *)fc_malloc(new_alloc);
|
||||||
|
if (new_buff == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(new_buff, buffer->buff, sizeof(*header));
|
||||||
|
free(buffer->buff);
|
||||||
|
buffer->buff = new_buff;
|
||||||
|
buffer->alloc_size = new_alloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fc_safe_read(fd, buff + sizeof(SFSerializerPackHeader),
|
if (fc_safe_read(fd, buffer->buff + sizeof(*header),
|
||||||
length) != length)
|
length) != length)
|
||||||
{
|
{
|
||||||
if (errno == 0) {
|
return ENODATA;
|
||||||
errno = ENODATA;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return total_bytes;
|
buffer->length = total_bytes;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -514,7 +514,8 @@ int sf_serializer_unpack(SFSerializerIterator *it, const string_t *content);
|
||||||
|
|
||||||
const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it);
|
const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it);
|
||||||
|
|
||||||
int sf_serializer_read_message(int fd, char *buff, const int size);
|
int sf_serializer_read_message(int fd, BufferInfo *buffer,
|
||||||
|
const int max_size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue