@@ -747,47 +747,20 @@ void valkeyReaderFree(valkeyReader *r) {
747747}
748748
749749int 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
832816oom :
@@ -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(). */
839823void 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
0 commit comments