| | @@ -343,48 +343,54 @@ |
| 343 | 343 | } |
| 344 | 344 | |
| 345 | 345 | /* |
| 346 | 346 | ** Processing flags |
| 347 | 347 | */ |
| 348 | | -#define FMT_SQL 0x00001 /* Generates SQL text */ |
| 349 | | -#define FMT_HTML 0x00002 /* Generates HTML text */ |
| 350 | | -#define FMT_URL 0x00004 /* Generates URLs */ |
| 351 | | -#define FMT_SAFE 0x00008 /* Always safe for %s */ |
| 348 | +#define FMT_SQL 0x00001 /* Generator for SQL text */ |
| 349 | +#define FMT_HTML 0x00002 /* Generator for HTML text */ |
| 350 | +#define FMT_URL 0x00004 /* Generator for URLs */ |
| 351 | +#define FMT_SAFE 0x00008 /* Generator for human-readable text */ |
| 352 | 352 | |
| 353 | 353 | /* |
| 354 | 354 | ** A list of internal Fossil interfaces that take a printf-style format |
| 355 | 355 | ** string. |
| 356 | 356 | */ |
| 357 | | -struct { |
| 357 | +struct FmtFunc { |
| 358 | 358 | const char *zFName; /* Name of the function */ |
| 359 | 359 | int iFmtArg; /* Index of format argument. Leftmost is 1. */ |
| 360 | 360 | unsigned fmtFlags; /* Processing flags */ |
| 361 | 361 | } aFmtFunc[] = { |
| 362 | | - { "admin_log", 1, 0 }, |
| 362 | + { "admin_log", 1, FMT_SAFE }, |
| 363 | + { "audit_append", 3, FMT_SAFE }, |
| 364 | + { "backofficeTrace", 1, FMT_SAFE }, |
| 363 | 365 | { "blob_append_sql", 2, FMT_SQL }, |
| 364 | | - { "blob_appendf", 2, 0 }, |
| 366 | + { "blob_appendf", 2, FMT_SAFE }, |
| 365 | 367 | { "cgi_debug", 1, FMT_SAFE }, |
| 366 | 368 | { "cgi_panic", 1, FMT_SAFE }, |
| 367 | 369 | { "cgi_printf", 1, FMT_HTML }, |
| 370 | + { "cgi_printf_header", 1, FMT_HTML }, |
| 368 | 371 | { "cgi_redirectf", 1, FMT_URL }, |
| 369 | 372 | { "chref", 2, FMT_URL }, |
| 373 | + { "CX", 1, FMT_HTML }, |
| 370 | 374 | { "db_blob", 2, FMT_SQL }, |
| 371 | 375 | { "db_debug", 1, FMT_SQL }, |
| 372 | 376 | { "db_double", 2, FMT_SQL }, |
| 373 | | - { "db_err", 1, 0 }, |
| 377 | + { "db_err", 1, FMT_SAFE }, |
| 374 | 378 | { "db_exists", 1, FMT_SQL }, |
| 375 | | - { "db_get_mprintf", 2, 0 }, |
| 379 | + { "db_get_mprintf", 2, FMT_SAFE }, |
| 376 | 380 | { "db_int", 2, FMT_SQL }, |
| 377 | 381 | { "db_int64", 2, FMT_SQL }, |
| 378 | 382 | { "db_multi_exec", 1, FMT_SQL }, |
| 379 | 383 | { "db_optional_sql", 2, FMT_SQL }, |
| 380 | 384 | { "db_prepare", 2, FMT_SQL }, |
| 381 | 385 | { "db_prepare_ignore_error", 2, FMT_SQL }, |
| 382 | | - { "db_set_mprintf", 3, 0 }, |
| 386 | + { "db_set_mprintf", 3, FMT_SAFE }, |
| 383 | 387 | { "db_static_prepare", 2, FMT_SQL }, |
| 384 | 388 | { "db_text", 2, FMT_SQL }, |
| 385 | | - { "db_unset_mprintf", 2, 0 }, |
| 389 | + { "db_unset_mprintf", 2, FMT_SAFE }, |
| 390 | + { "emailerError", 2, FMT_SAFE }, |
| 391 | + { "fileedit_ajax_error", 2, FMT_SAFE }, |
| 386 | 392 | { "form_begin", 2, FMT_URL }, |
| 387 | 393 | { "fossil_error", 2, FMT_SAFE }, |
| 388 | 394 | { "fossil_errorlog", 1, FMT_SAFE }, |
| 389 | 395 | { "fossil_fatal", 1, FMT_SAFE }, |
| 390 | 396 | { "fossil_fatal_recursive", 1, FMT_SAFE }, |
| | @@ -391,24 +397,36 @@ |
| 391 | 397 | { "fossil_panic", 1, FMT_SAFE }, |
| 392 | 398 | { "fossil_print", 1, FMT_SAFE }, |
| 393 | 399 | { "fossil_trace", 1, FMT_SAFE }, |
| 394 | 400 | { "fossil_warning", 1, FMT_SAFE }, |
| 395 | 401 | { "href", 1, FMT_URL }, |
| 396 | | - { "json_new_string_f", 1, 0 }, |
| 397 | | - { "json_set_err", 2, 0 }, |
| 398 | | - { "json_warn", 2, 0 }, |
| 399 | | - { "mprintf", 1, 0 }, |
| 400 | | - { "socket_set_errmsg", 1, 0 }, |
| 401 | | - { "ssl_set_errmsg", 1, 0 }, |
| 402 | + { "json_new_string_f", 1, FMT_SAFE }, |
| 403 | + { "json_set_err", 2, FMT_SAFE }, |
| 404 | + { "json_warn", 2, FMT_SAFE }, |
| 405 | + { "mprintf", 1, FMT_SAFE }, |
| 406 | + { "pop3_print", 2, FMT_SAFE }, |
| 407 | + { "smtp_send_line", 2, FMT_SAFE }, |
| 408 | + { "smtp_server_send", 2, FMT_SAFE }, |
| 409 | + { "socket_set_errmsg", 1, FMT_SAFE }, |
| 410 | + { "ssl_set_errmsg", 1, FMT_SAFE }, |
| 402 | 411 | { "style_header", 1, FMT_HTML }, |
| 403 | 412 | { "style_js_onload", 1, FMT_HTML }, |
| 404 | 413 | { "style_set_current_page", 1, FMT_URL }, |
| 405 | 414 | { "style_submenu_element", 2, FMT_URL }, |
| 406 | 415 | { "style_submenu_sql", 3, FMT_SQL }, |
| 407 | 416 | { "webpage_error", 1, FMT_SAFE }, |
| 408 | 417 | { "xhref", 2, FMT_URL }, |
| 409 | 418 | }; |
| 419 | + |
| 420 | +/* |
| 421 | +** Comparison function for two FmtFunc entries |
| 422 | +*/ |
| 423 | +static int fmtfunc_cmp(const void *pAA, const void *pBB){ |
| 424 | + const struct FmtFunc *pA = (const struct FmtFunc*)pAA; |
| 425 | + const struct FmtFunc *pB = (const struct FmtFunc*)pBB; |
| 426 | + return strcmp(pA->zFName, pB->zFName); |
| 427 | +} |
| 410 | 428 | |
| 411 | 429 | /* |
| 412 | 430 | ** Determine if the indentifier zIdent of length nIndent is a Fossil |
| 413 | 431 | ** internal interface that uses a printf-style argument. Return zero if not. |
| 414 | 432 | ** Return the index of the format string if true with the left-most |
| | @@ -625,10 +643,12 @@ |
| 625 | 643 | ** The eVerbose global variable is incremented with each "-v" argument. |
| 626 | 644 | */ |
| 627 | 645 | int main(int argc, char **argv){ |
| 628 | 646 | int i; |
| 629 | 647 | int nErr = 0; |
| 648 | + qsort(aFmtFunc, sizeof(aFmtFunc)/sizeof(aFmtFunc[0]), |
| 649 | + sizeof(aFmtFunc[0]), fmtfunc_cmp); |
| 630 | 650 | for(i=1; i<argc; i++){ |
| 631 | 651 | char *zFile; |
| 632 | 652 | if( strcmp(argv[i],"-v")==0 ){ |
| 633 | 653 | eVerbose++; |
| 634 | 654 | continue; |
| 635 | 655 | |