| Bug #47212 | Crash in DBUG_PRINT in mysqltest.cc when trying to print octal number | ||
|---|---|---|---|
| Submitted: | 9 Sep 2009 9:14 | Modified: | 14 Mar 2010 1:10 |
| Reporter: | Martin Skold | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S3 (Non-critical) |
| Version: | 5.1.37 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[9 Sep 2009 17:35]
Sergei Golubchik
and the correct fix is to add support for %o to my_vsnprintf(), not to remove %o from DBUG_PRINT. When extending my_vsnprintf don't forget to document it in include/mysql/service_my_snprintf.h
[25 Sep 2009 8:19]
Sergei Golubchik
by the way, that's the patch I'll push (but not in 5.1)
=== modified file 'include/mysql/service_my_snprintf.h'
--- include/mysql/service_my_snprintf.h 2009-05-04 17:14:38 +0000
+++ include/mysql/service_my_snprintf.h 2009-09-25 07:54:34 +0000
@@ -47,7 +47,7 @@
<length modifier> can be 'l', 'll', or 'z'.
Supported formats are 's' (null pointer is accepted, printed as
- "(null)"), 'b' (extension, see below), 'c', 'f', 'g', 'd', 'u', 'x',
+ "(null)"), 'b' (extension, see below), 'c', 'f', 'g', 'd', 'u', 'x', 'o',
'X', 'p' (works as 0x%x).
Extensions:
=== modified file 'strings/my_vsnprintf.c'
--- strings/my_vsnprintf.c 2009-07-03 05:54:09 +0000
+++ strings/my_vsnprintf.c 2009-09-25 07:54:06 +0000
@@ -265,6 +265,10 @@ static char *process_int_arg(char *to, c
store_start[1]= 'x';
store_end= ll2str(par, store_start + 2, 16, 0);
}
+ else if (arg_type == 'o')
+ {
+ store_end= ll2str(par, store_start, 8, 0);
+ }
else
{
DBUG_ASSERT(arg_type == 'X' || arg_type =='x');
@@ -595,7 +599,7 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs,
to= process_dbl_arg(to, end, width, d, *fmt);
}
else if (*fmt == 'd' || *fmt == 'u' || *fmt == 'x' || *fmt == 'X' ||
- *fmt == 'p')
+ *fmt == 'p' || *fmt == 'o')
{
/* Integer parameter */
longlong larg;
@@ -690,6 +694,7 @@ int main()
my_printf("Hello hhhhhhhhhhhhhh %d sssssssssssssss\n", 1);
my_printf("Hello %u\n", 1);
my_printf("Hex: %lx '%6lx'\n", 32, 65);
+ my_printf("Octal: %lo '%6lo'\n", 32, 65);
my_printf("conn %ld to: '%-.64s' user: '%-.32s' host:\
`%-.64s' (%-.64s)", 1, 0,0,0,0);
my_printf("My %.4f test %.4g\n", 5, 5);
[6 Mar 2010 11:07]
Bugs System
Pushed into 5.5.3-m3 (revid:alik@sun.com-20100306103849-hha31z2enhh7jwt3) (version source revid:vvaintroub@fedora12-20091225154921-x25a5pyw1pxiwobv) (merge vers: 5.5.99) (pib:16)
[14 Mar 2010 1:10]
Paul DuBois
Noted in 5.5.3 changelog. Attempts to print octal numbers with my_vsnprintf() could cause a crash.

Description: In mysqltest.cc a DBUG_PRINT statement causes crashes: 3049: DBUG_PRINT("info", ("chmod %o %s", (uint)mode, ds_file.str)); because formating octal numbers is not supported. How to repeat: Run any test with --debug flag. Suggested fix: Either remove printout/change it or do something like: #ifndef DBUG_OFF { char dbug_str[2048]; sprintf(dbug_str, "chmod %o %s", (uint)mode, ds_file.str); DBUG_PRINT("info", ("%s", dbug_str)); } #endif