=== modified file 'grub-core/kern/misc.c' --- grub-core/kern/misc.c 2011-04-18 21:03:52 +0000 +++ grub-core/kern/misc.c 2011-04-22 07:13:52 +0000 @@ -726,45 +726,70 @@ int longlongfmt = 0; int unsig = 0; - if (*fmt && *fmt =='-') - { - rightfill = 1; - fmt++; - } - - p = (char *) fmt; - /* Read formatting parameters. */ - while (*p && grub_isdigit (*p)) - p++; - - if (p > fmt) - { - char s[p - fmt + 1]; - grub_strncpy (s, fmt, p - fmt); - s[p - fmt] = 0; - if (s[0] == '0') - zerofill = '0'; - format1 = grub_strtoul (s, 0, 10); - fmt = p; - } - - if (*p && *p == '.') - { - p++; - fmt++; + if (*fmt && *fmt == '*') + { + fmt++; + n = va_arg (args, int); + if (n < 0) + { + rightfill = 1; + n = -n; + } + format1 = n; + } + else + { + if (*fmt && *fmt =='-') + { + rightfill = 1; + fmt++; + } + + p = (char *) fmt; + /* Read formatting parameters. */ while (*p && grub_isdigit (*p)) p++; if (p > fmt) { - char fstr[p - fmt + 1]; - grub_strncpy (fstr, fmt, p - fmt); - fstr[p - fmt] = 0; - format2 = grub_strtoul (fstr, 0, 10); + char s[p - fmt + 1]; + grub_strncpy (s, fmt, p - fmt); + s[p - fmt] = 0; + if (s[0] == '0') + zerofill = '0'; + format1 = grub_strtoul (s, 0, 10); fmt = p; } } + if (*fmt && *fmt == '.') + { + fmt++; + if (*fmt && *fmt == '*') + { + fmt++; + n = va_arg (args, int); + if (n < 0) + n = 0; + format2 = n; + } + else + { + p = (char *) fmt; + while (*p && grub_isdigit (*p)) + p++; + + if (p > fmt) + { + char fstr[p - fmt + 1]; + grub_strncpy (fstr, fmt, p - fmt); + fstr[p - fmt] = 0; + format2 = grub_strtoul (fstr, 0, 10); + fmt = p; + } + } + } + c = *fmt++; if (c == 'l') {