6767
6868# include <limits.h>
6969# include <stddef.h> /* size_t */
70+ # include <stdint.h> // SIZE_MAX
7071
7172static int URI_FUNC (ComposeQueryEngine )(URI_CHAR * dest ,
7273 const URI_TYPE (QueryList ) * queryList ,
@@ -254,7 +255,14 @@ int URI_FUNC(ComposeQueryEngine)(URI_CHAR * dest, const URI_TYPE(QueryList) * qu
254255 if (dest != NULL ) {
255256 write [0 ] = _UT ('\0' );
256257 if (charsWritten != NULL ) {
257- * charsWritten = (int )(write - dest ) + 1 ; /* .. for terminator */
258+ const size_t lenInChars = write - dest ;
259+
260+ // Detect and avoid integer overflow
261+ if (lenInChars > INT_MAX - 1 ) {
262+ return URI_ERROR_OUTPUT_TOO_LARGE ;
263+ }
264+
265+ * charsWritten = (int )(lenInChars + 1 ); /* .. for terminator */
258266 }
259267 }
260268
@@ -267,8 +275,8 @@ UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) * *prevNext, int * itemCou
267275 const URI_CHAR * valueAfter , UriBool plusToSpace ,
268276 UriBreakConversion breakConversion ,
269277 UriMemoryManager * memory ) {
270- const int keyLen = ( int )( keyAfter - keyFirst ) ;
271- const int valueLen = ( int )( valueAfter - valueFirst ) ;
278+ const size_t keyLen = keyAfter - keyFirst ;
279+ const size_t valueLen = valueAfter - valueFirst ;
272280 URI_CHAR * key ;
273281 URI_CHAR * value ;
274282
@@ -285,6 +293,13 @@ UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) * *prevNext, int * itemCou
285293 }
286294 (* prevNext )-> next = NULL ;
287295
296+ // Detect integer overflow
297+ if ((keyLen > SIZE_MAX - 1 ) || (keyLen + 1 > SIZE_MAX / sizeof (URI_CHAR ))) {
298+ memory -> free (memory , * prevNext );
299+ * prevNext = NULL ;
300+ return URI_FALSE ; // Raises malloc error
301+ }
302+
288303 /* Fill key */
289304 key = memory -> malloc (memory , (keyLen + 1 ) * sizeof (URI_CHAR ));
290305 if (key == NULL ) {
@@ -305,6 +320,14 @@ UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) * *prevNext, int * itemCou
305320
306321 /* Fill value */
307322 if (valueFirst != NULL ) {
323+ // Detect integer overflow
324+ if ((valueLen > SIZE_MAX - 1 ) || (valueLen + 1 > SIZE_MAX / sizeof (URI_CHAR ))) {
325+ memory -> free (memory , key );
326+ memory -> free (memory , * prevNext );
327+ * prevNext = NULL ;
328+ return URI_FALSE ; // Raises malloc error
329+ }
330+
308331 value = memory -> malloc (memory , (valueLen + 1 ) * sizeof (URI_CHAR ));
309332 if (value == NULL ) {
310333 memory -> free (memory , key );
0 commit comments