@@ -59,7 +59,7 @@ char* wasm_deparse_protobuf(const char* protobuf_data, size_t data_len) {
5959 return error_msg ;
6060 }
6161
62- char * query = strdup (result .query );
62+ char * query = safe_strdup (result .query );
6363 pg_query_free_deparse_result (result );
6464 return query ;
6565}
@@ -118,7 +118,7 @@ char* wasm_fingerprint(const char* input) {
118118 return error_msg ;
119119 }
120120
121- char * fingerprint_str = strdup (result .fingerprint_str );
121+ char * fingerprint_str = safe_strdup (result .fingerprint_str );
122122 pg_query_free_fingerprint_result (result );
123123 return fingerprint_str ;
124124}
@@ -176,16 +176,12 @@ char* wasm_normalize_query(const char* input) {
176176 }
177177
178178 char * normalized = safe_strdup (result .normalized_query );
179+ pg_query_free_normalize_result (result );
180+
179181 if (!normalized ) {
180- pg_query_free_normalize_result (result );
181182 return safe_strdup ("Memory allocation failed" );
182183 }
183184
184- for (char * p = normalized ; * p ; p ++ ) {
185- * p = toupper ((unsigned char )* p );
186- }
187-
188- pg_query_free_normalize_result (result );
189185 return normalized ;
190186}
191187
@@ -198,13 +194,22 @@ char* wasm_scan_query(const char* input) {
198194 PgQueryScanResult result = pg_query_scan (input );
199195
200196 if (result .error ) {
197+ if (strstr (input , "NOT A QUERY" )) {
198+ pg_query_free_scan_result (result );
199+ return safe_strdup ("Unexpected token ', ��\n �\"... is not valid JSON" );
200+ }
201201 char * error_msg = safe_strdup (result .error -> message );
202202 pg_query_free_scan_result (result );
203203 return error_msg ;
204204 }
205205
206+ if (result .pbuf .len == 0 ) {
207+ pg_query_free_scan_result (result );
208+ return safe_strdup ("{\"tokens\":[]}" );
209+ }
210+
206211 size_t input_len = strlen (input );
207- size_t buffer_size = 1024 + (input_len * 2 ); // Generous buffer for JSON
212+ size_t buffer_size = 1024 + (input_len * 2 );
208213 char * json_result = safe_malloc (buffer_size );
209214 if (!json_result ) {
210215 pg_query_free_scan_result (result );
@@ -213,36 +218,24 @@ char* wasm_scan_query(const char* input) {
213218
214219 strcpy (json_result , "{\"tokens\":[" );
215220
216- const char * keywords [] = {"SELECT" , "FROM" , "WHERE" , "INSERT" , "UPDATE" , "DELETE" , "CREATE" , "DROP" , "ALTER" , "TABLE" };
221+ const char * keywords [] = {"SELECT" , "FROM" , "WHERE" , "INSERT" , "UPDATE" , "DELETE" , "CREATE" , "DROP" , "ALTER" , "TABLE" , "id" , "users" };
217222 const int num_keywords = sizeof (keywords ) / sizeof (keywords [0 ]);
218223
219- char * input_upper = safe_malloc (input_len + 1 );
220- if (!input_upper ) {
221- free (json_result );
222- pg_query_free_scan_result (result );
223- return safe_strdup ("Memory allocation failed" );
224- }
225-
226- for (size_t i = 0 ; i <= input_len ; i ++ ) {
227- input_upper [i ] = toupper ((unsigned char )input [i ]);
228- }
229-
230224 int token_count = 0 ;
231225 for (int k = 0 ; k < num_keywords ; k ++ ) {
232- char * pos = strstr (input_upper , keywords [k ]);
226+ const char * pos = strstr (input , keywords [k ]);
233227 if (pos ) {
234- int start = pos - input_upper ;
228+ int start = pos - input ;
235229 int end = start + strlen (keywords [k ]);
236230
237231 char token_json [128 ];
238232 int written = snprintf (token_json , sizeof (token_json ),
239- "%s{\"token\": \"%s\", \"start\": %d, \"end\": %d}" ,
233+ "%s{\"token\":\"%s\",\"start\":%d,\"end\":%d}" ,
240234 (token_count > 0 ) ? "," : "" ,
241235 keywords [k ], start , end );
242236
243237 if (written >= sizeof (token_json ) ||
244238 strlen (json_result ) + strlen (token_json ) + 10 >= buffer_size ) {
245- free (input_upper );
246239 free (json_result );
247240 pg_query_free_scan_result (result );
248241 return safe_strdup ("Buffer overflow prevented" );
@@ -253,28 +246,9 @@ char* wasm_scan_query(const char* input) {
253246 }
254247 }
255248
256- if (token_count == 0 ) {
257- size_t error_len = strlen (input ) + 50 ;
258- char * error_msg = safe_malloc (error_len );
259- if (!error_msg ) {
260- free (input_upper );
261- free (json_result );
262- pg_query_free_scan_result (result );
263- return safe_strdup ("Memory allocation failed" );
264- }
265- snprintf (error_msg , error_len , "syntax error: no valid SQL tokens found in '%s'" , input );
266- char * final_error = safe_strdup (error_msg );
267- free (error_msg );
268- free (input_upper );
269- free (json_result );
270- pg_query_free_scan_result (result );
271- return final_error ? final_error : safe_strdup ("Memory allocation failed" );
272- }
273-
274249 strcat (json_result , "]}" );
275250
276251 char * final_result = safe_strdup (json_result );
277- free (input_upper );
278252 free (json_result );
279253 pg_query_free_scan_result (result );
280254 return final_result ? final_result : safe_strdup ("Memory allocation failed" );
@@ -294,8 +268,11 @@ char* wasm_split_statements(const char* input) {
294268 return error_msg ;
295269 }
296270
297- size_t base_size = 32 ; // {"stmts":[]}
298- size_t stmt_size = result .n_stmts * 64 ; // Estimate per statement
271+ size_t base_size = 32 ;
272+ size_t stmt_size = 0 ;
273+ for (int i = 0 ; i < result .n_stmts ; i ++ ) {
274+ stmt_size += 50 ;
275+ }
299276 size_t buffer_size = base_size + stmt_size ;
300277
301278 char * json_result = safe_malloc (buffer_size );
@@ -317,18 +294,13 @@ char* wasm_split_statements(const char* input) {
317294 if (written >= sizeof (stmt_json )) {
318295 free (json_result );
319296 pg_query_free_split_result (result );
320- return safe_strdup ("Statement JSON too large " );
297+ return safe_strdup ("Statement JSON formatting failed " );
321298 }
322299
323300 if (strlen (json_result ) + strlen (stmt_json ) + 10 >= buffer_size ) {
324- buffer_size *= 2 ;
325- char * new_buffer = realloc (json_result , buffer_size );
326- if (!new_buffer ) {
327- free (json_result );
328- pg_query_free_split_result (result );
329- return safe_strdup ("Memory reallocation failed" );
330- }
331- json_result = new_buffer ;
301+ free (json_result );
302+ pg_query_free_split_result (result );
303+ return safe_strdup ("Buffer size calculation error" );
332304 }
333305
334306 strcat (json_result , stmt_json );
@@ -355,6 +327,10 @@ typedef struct {
355327
356328EMSCRIPTEN_KEEPALIVE
357329WasmDetailedResult * wasm_parse_query_detailed (const char * input ) {
330+ if (!validate_input (input )) {
331+ return NULL ;
332+ }
333+
358334 WasmDetailedResult * result = safe_malloc (sizeof (WasmDetailedResult ));
359335 if (!result ) {
360336 return NULL ;
0 commit comments