Skip to content

Commit adb6e95

Browse files
committed
Clean up types and refactor valkeyReaderFeed
Signed-off-by: Viktor Söderqvist <viktor.soderqvist@est.tech>
1 parent 270f569 commit adb6e95

File tree

4 files changed

+24
-39
lines changed

4 files changed

+24
-39
lines changed

src/read.c

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -747,47 +747,20 @@ void valkeyReaderFree(valkeyReader *r) {
747747
}
748748

749749
int valkeyReaderFeed(valkeyReader *r, const char *buf, size_t len) {
750-
sds newbuf;
751-
752750
/* Return early when this reader is in an erroneous state. */
753751
if (r->err)
754752
return VALKEY_ERR;
755753

756-
/* Copy the provided buffer. */
757754
if (buf != NULL && len >= 1) {
758-
/* Destroy internal buffer when it is empty and is quite large. */
759-
if (r->len == 0 && r->maxbuf != 0 && sdsavail(r->buf) > r->maxbuf) {
760-
sdsfree(r->buf);
761-
r->buf = sdsempty();
762-
if (r->buf == 0)
763-
goto oom;
764-
765-
r->pos = 0;
766-
}
767-
768-
/* Discard consumed data before appending, to avoid unbounded growth.
769-
* This replaces the per-reply sdsrange() in valkeyReaderGetReply(),
770-
* so the memmove happens at most once per feed call. */
771-
if (r->pos > 0) {
772-
if (sdslen(r->buf) > SSIZE_MAX)
773-
goto oom;
774-
sdsrange(r->buf, r->pos, -1);
775-
r->pos = 0;
776-
r->len = sdslen(r->buf);
777-
}
778-
779-
newbuf = sdscatlen(r->buf, buf, len);
780-
if (newbuf == NULL)
781-
goto oom;
782-
783-
r->buf = newbuf;
784-
r->len = sdslen(r->buf);
755+
char *dest;
756+
size_t cap;
757+
if (valkeyReaderGetReadBuf(r, &dest, &cap, len) != VALKEY_OK)
758+
return VALKEY_ERR;
759+
memcpy(dest, buf, len);
760+
valkeyReaderCommitRead(r, len);
785761
}
786762

787763
return VALKEY_OK;
788-
oom:
789-
valkeyReaderSetErrorOOM(r);
790-
return VALKEY_ERR;
791764
}
792765

793766
/* Prepare the reader's internal buffer for a direct read. This compacts
@@ -799,6 +772,12 @@ int valkeyReaderGetReadBuf(valkeyReader *r, char **buf, size_t *cap, size_t minb
799772
if (r->err)
800773
return VALKEY_ERR;
801774

775+
if (minbytes > SSIZE_MAX) {
776+
valkeyReaderSetError(r, VALKEY_ERR_PROTOCOL,
777+
"Requested buffer size too large");
778+
return VALKEY_ERR;
779+
}
780+
802781
/* Destroy internal buffer when it is empty and is quite large. */
803782
if (r->len == 0 && r->maxbuf != 0 && sdsavail(r->buf) > r->maxbuf) {
804783
sdsfree(r->buf);
@@ -810,8 +789,11 @@ int valkeyReaderGetReadBuf(valkeyReader *r, char **buf, size_t *cap, size_t minb
810789

811790
/* Compact consumed data. */
812791
if (r->pos > 0) {
813-
if (sdslen(r->buf) > SSIZE_MAX)
814-
goto oom;
792+
if (sdslen(r->buf) > SSIZE_MAX) {
793+
valkeyReaderSetError(r, VALKEY_ERR_PROTOCOL,
794+
"Reader buffer is too large");
795+
return VALKEY_ERR;
796+
}
815797
sdsrange(r->buf, r->pos, -1);
816798
r->pos = 0;
817799
r->len = sdslen(r->buf);
@@ -827,6 +809,8 @@ int valkeyReaderGetReadBuf(valkeyReader *r, char **buf, size_t *cap, size_t minb
827809

828810
*buf = r->buf + sdslen(r->buf);
829811
*cap = sdsavail(r->buf);
812+
if (*cap > SSIZE_MAX)
813+
*cap = SSIZE_MAX;
830814
return VALKEY_OK;
831815

832816
oom:
@@ -837,7 +821,8 @@ int valkeyReaderGetReadBuf(valkeyReader *r, char **buf, size_t *cap, size_t minb
837821
/* Commit bytes that were written directly into the buffer obtained from
838822
* valkeyReaderGetReadBuf(). */
839823
void valkeyReaderCommitRead(valkeyReader *r, size_t nread) {
840-
sdsIncrLen(r->buf, (int)nread);
824+
assert(nread <= SSIZE_MAX);
825+
sdsIncrLen(r->buf, (ssize_t)nread);
841826
r->len = sdslen(r->buf);
842827
}
843828

src/sds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ void *sdsAllocPtr(sds s) {
329329
* ... check for nread <= 0 and handle it ...
330330
* sdsIncrLen(s, nread);
331331
*/
332-
void sdsIncrLen(sds s, int incr) {
332+
void sdsIncrLen(sds s, ssize_t incr) {
333333
unsigned char flags = s[-1];
334334
size_t len;
335335
switch (flags & SDS_TYPE_MASK) {

src/sds.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen);
261261

262262
/* Low level functions exposed to the user API */
263263
sds sdsMakeRoomFor(sds s, size_t addlen);
264-
void sdsIncrLen(sds s, int incr);
264+
void sdsIncrLen(sds s, ssize_t incr);
265265
sds sdsRemoveFreeSpace(sds s);
266266
size_t sdsAllocSize(sds s);
267267
void *sdsAllocPtr(sds s);

src/valkey.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ valkeyPushFn *valkeySetPushCallback(valkeyContext *c, valkeyPushFn *fn) {
10021002
* After this function is called, you may use valkeyGetReplyFromReader to
10031003
* see if there is a reply available. */
10041004
int valkeyBufferRead(valkeyContext *c) {
1005-
int nread;
1005+
ssize_t nread;
10061006

10071007
/* Return early when the context has seen an error. */
10081008
if (c->err)

0 commit comments

Comments
 (0)