function sf_serializer_read_message changed

storage_engine
YuQing 2021-11-18 11:19:32 +08:00
parent 320f344b3e
commit 15fc77703a
2 changed files with 31 additions and 28 deletions

View File

@ -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;
} }
if (fc_safe_read(fd, buff + sizeof(SFSerializerPackHeader), 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, 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;
} }

View File

@ -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
} }