@@ -64,23 +64,33 @@ inline int qs_strncmp(const char * s, const char * qs, size_t n)
6464 if ( u1 == ' +' ) { u1 = ' ' ; }
6565 if ( u1 == ' %' ) // easier/safer than scanf
6666 {
67- unyb = static_cast <unsigned char >(*s++);
68- lnyb = static_cast <unsigned char >(*s++);
69- if ( CROW_QS_ISHEX (unyb) && CROW_QS_ISHEX (lnyb) )
67+ // Check that next two chars exist and are valid hex before reading
68+ if ( CROW_QS_ISHEX (s[0 ]) && CROW_QS_ISHEX (s[1 ]) )
69+ {
70+ unyb = static_cast <unsigned char >(*s++);
71+ lnyb = static_cast <unsigned char >(*s++);
7072 u1 = (CROW_QS_HEX2DEC (unyb) * 16 ) + CROW_QS_HEX2DEC (lnyb);
73+ }
7174 else
75+ {
7276 u1 = ' \0 ' ;
77+ }
7378 }
7479
7580 if ( u2 == ' +' ) { u2 = ' ' ; }
7681 if ( u2 == ' %' ) // easier/safer than scanf
7782 {
78- unyb = static_cast <unsigned char >(*qs++);
79- lnyb = static_cast <unsigned char >(*qs++);
80- if ( CROW_QS_ISHEX (unyb) && CROW_QS_ISHEX (lnyb) )
83+ // Check that next two chars exist and are valid hex before reading
84+ if ( CROW_QS_ISHEX (qs[0 ]) && CROW_QS_ISHEX (qs[1 ]) )
85+ {
86+ unyb = static_cast <unsigned char >(*qs++);
87+ lnyb = static_cast <unsigned char >(*qs++);
8188 u2 = (CROW_QS_HEX2DEC (unyb) * 16 ) + CROW_QS_HEX2DEC (lnyb);
89+ }
8290 else
91+ {
8392 u2 = ' \0 ' ;
93+ }
8494 }
8595
8696 if ( u1 != u2 )
@@ -150,7 +160,9 @@ inline int qs_decode(char * qs)
150160 if ( qs[j] == ' +' ) { qs[i] = ' ' ; }
151161 else if ( qs[j] == ' %' ) // easier/safer than scanf
152162 {
153- if ( ! CROW_QS_ISHEX (qs[j+1 ]) || ! CROW_QS_ISHEX (qs[j+2 ]) )
163+ // Check bounds before reading: ensure j+1 and j+2 are within string
164+ if ( qs[j+1 ] == ' \0 ' || qs[j+2 ] == ' \0 ' ||
165+ ! CROW_QS_ISHEX (qs[j+1 ]) || ! CROW_QS_ISHEX (qs[j+2 ]) )
154166 {
155167 qs[i] = ' \0 ' ;
156168 return i;
0 commit comments