Patch by Pierre Aubert, 15 Mar 2004:

Fix buffer overflow in IDE identification
This commit is contained in:
wdenk 2004-03-17 01:13:07 +00:00
parent d9df1f4e66
commit 7d7ce4125f
6 changed files with 53 additions and 59 deletions

View File

@ -2,6 +2,13 @@
Changes for U-Boot 1.0.2: Changes for U-Boot 1.0.2:
====================================================================== ======================================================================
* Patch by Pierre Aubert, 15 Mar 2004:
Fix buffer overflow in IDE identification
* Fix power-off of LCD for out-of-band temperatures on LWMON board
* Remove redundand #define in IceCube.h
* Patch by Steven Scholz, 27 Feb 2004: * Patch by Steven Scholz, 27 Feb 2004:
- Adding get_ticks() and get_tbclk() for AT91RM9200 - Adding get_ticks() and get_tbclk() for AT91RM9200
- Many white space fixes in cpu/at91rm9200/interrupts.c - Many white space fixes in cpu/at91rm9200/interrupts.c
@ -29,7 +36,7 @@ Changes for U-Boot 1.0.2:
* Patch by George G. Davis, 11 Mar 2004: * Patch by George G. Davis, 11 Mar 2004:
add support for ADS GraphicsClient+ board. add support for ADS GraphicsClient+ board.
* Patch by Pierre Aubert, 11 Mar 2004: * Patch by Pierre Aubert, 11 Mar 2004:
- add bitmap command and splash screen support in cfb console - add bitmap command and splash screen support in cfb console
- add [optional] origin in the bitmap display command - add [optional] origin in the bitmap display command
@ -57,7 +64,7 @@ Changes for U-Boot 1.0.2:
Don't overwrite server IP address or boot file name Don't overwrite server IP address or boot file name
when the boot server does not return values when the boot server does not return values
* Patch by listmember@orkun.us, 5 Mar 2004: * Patch by Tolunay Orkun, 5 Mar 2004:
Removed compile time restriction on CFG_I2C_SPEED for DS1338 RTC Removed compile time restriction on CFG_I2C_SPEED for DS1338 RTC
* Patch by Tolunay Orkun, 5 Mar 2004: * Patch by Tolunay Orkun, 5 Mar 2004:

View File

@ -1410,27 +1410,31 @@ WR_OUT:
/* /*
* copy src to dest, skipping leading and trailing blanks and null * copy src to dest, skipping leading and trailing blanks and null
* terminate the string * terminate the string
* "len" is the size of available memory including the terminating '\0'
*/ */
static void ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len) static void ident_cpy (unsigned char *dst, unsigned char *src, unsigned int len)
{ {
int start,end; unsigned char *end, *last;
start=0; last = dst;
while (start<len) { end = src + len;
if (src[start]!=' ')
break; /* reserve space for '\0' */
start++; if (len < 2)
goto OUT;
/* skip leading white space */
while ((*src) && (src<end) && (*src==' '))
++src;
/* copy string, omitting trailing white space */
while ((*src) && (src<end)) {
*dst++ = *src;
if (*src++ != ' ')
last = dst;
} }
end=len-1; OUT:
while (end>start) { *last = '\0';
if (src[end]!=' ')
break;
end--;
}
for ( ; start<=end; start++) {
*dest++=src[start];
}
*dest='\0';
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */

View File

@ -1057,7 +1057,7 @@ static void lcd_enable (void)
#if defined(CONFIG_LWMON) #if defined(CONFIG_LWMON)
{ uchar c = pic_read (0x60); { uchar c = pic_read (0x60);
#if defined(CONFIG_LCD) && defined(CONFIG_LWMON) && (CONFIG_POST & CFG_POST_SYSMON) #if defined(CONFIG_LCD) && defined(CONFIG_LWMON) && (CONFIG_POST & CFG_POST_SYSMON)
c |= 0x04; /* Chip Enable LCD */ /* Enable LCD later in sysmon test, only if temperature is OK */
#else #else
c |= 0x07; /* Power on CCFL, Enable CCFL, Chip Enable LCD */ c |= 0x07; /* Power on CCFL, Enable CCFL, Chip Enable LCD */
#endif #endif

View File

@ -89,7 +89,6 @@
#if 1 #if 1
#define CONFIG_USB_OHCI #define CONFIG_USB_OHCI
#define ADD_USB_CMD CFG_CMD_USB | CFG_CMD_FAT #define ADD_USB_CMD CFG_CMD_USB | CFG_CMD_FAT
#define CONFIG_DOS_PARTITION
#define CONFIG_USB_STORAGE #define CONFIG_USB_STORAGE
#else #else
#define ADD_USB_CMD 0 #define ADD_USB_CMD 0

View File

@ -37,9 +37,9 @@ typedef struct block_dev_desc {
#endif #endif
unsigned long lba; /* number of blocks */ unsigned long lba; /* number of blocks */
unsigned long blksz; /* block size */ unsigned long blksz; /* block size */
unsigned char vendor[40]; /* IDE model, SCSI Vendor */ unsigned char vendor [40+1]; /* IDE model, SCSI Vendor */
unsigned char product[20]; /* IDE Serial no, SCSI product */ unsigned char product[20+1]; /* IDE Serial no, SCSI product */
unsigned char revision[8]; /* firmware revision */ unsigned char revision[8+1]; /* firmware revision */
unsigned long (*block_read)(int dev, unsigned long (*block_read)(int dev,
unsigned long start, unsigned long start,
unsigned long blkcnt, unsigned long blkcnt,

View File

@ -115,10 +115,10 @@ struct sysmon_table_s
static sysmon_table_t sysmon_table[] = static sysmon_table_t sysmon_table[] =
{ {
{"Board temperature", " C", &sysmon_lm87_sgn, NULL, sysmon_ccfl_disable, {"Board temperature", " C", &sysmon_lm87_sgn, NULL, sysmon_ccfl_disable,
1, 1, -128, 127, 0xFF, 0x58, 0xD5, 0, 0x67, 0xC6, 0, 0x27}, 1, 1, -128, 127, 0xFF, 0x58, 0xD5, 0, 0x6C, 0xC6, 0, 0x27},
{"Front temperature", " C", &sysmon_lm87, NULL, sysmon_ccfl_disable, {"Front temperature", " C", &sysmon_lm87, NULL, sysmon_ccfl_disable,
1, 100, -27316, 8984, 0xFF, 0xA4, 0xFC, 0, 0xAE, 0xF1, 0, 0x29}, 1, 100, -27316, 8984, 0xFF, 0xA4, 0xFC, 0, 0xB2, 0xF1, 0, 0x29},
{"+3.3V CPU logic", "V", &sysmon_lm87, NULL, NULL, {"+3.3V CPU logic", "V", &sysmon_lm87, NULL, NULL,
100, 1000, 0, 4386, 0xFF, 0xB6, 0xC9, 0, 0xB6, 0xC9, 0, 0x22}, 100, 1000, 0, 4386, 0xFF, 0xB6, 0xC9, 0, 0xB6, 0xC9, 0, 0x22},
@ -150,8 +150,7 @@ int sysmon_init_f (void)
reg |= 0x09; reg |= 0x09;
pic_write (0x60, reg); pic_write (0x60, reg);
for (l = sysmon_list; *l; l++) for (l = sysmon_list; *l; l++) {
{
(*l)->init(*l); (*l)->init(*l);
} }
@ -165,15 +164,13 @@ void sysmon_reloc (void)
sysmon_t ** l; sysmon_t ** l;
sysmon_table_t * t; sysmon_table_t * t;
for (l = sysmon_list; *l; l++) for (l = sysmon_list; *l; l++) {
{
RELOC(*l); RELOC(*l);
RELOC((*l)->init); RELOC((*l)->init);
RELOC((*l)->read); RELOC((*l)->read);
} }
for (t = sysmon_table; t < sysmon_table + sysmon_table_size; t ++) for (t = sysmon_table; t < sysmon_table + sysmon_table_size; t ++) {
{
RELOC(t->exec_before); RELOC(t->exec_before);
RELOC(t->exec_after); RELOC(t->exec_after);
RELOC(t->sysmon); RELOC(t->sysmon);
@ -204,12 +201,10 @@ static char *sysmon_unit_value (sysmon_table_t *s, uint val)
dec = s->unit_precision; dec = s->unit_precision;
if (dec != 1) if (dec != 1) {
{
*p++ = '.'; *p++ = '.';
} }
for (dec /= 10; dec != 0; dec /= 10) for (dec /= 10; dec != 0; dec /= 10) {
{
*p++ = '0' + (frac / dec) % 10; *p++ = '0' + (frac / dec) % 10;
} }
strcpy(p, s->unit_name); strcpy(p, s->unit_name);
@ -223,24 +218,21 @@ static void sysmon_lm87_init (sysmon_t * this)
/* Detect LM87 chip */ /* Detect LM87 chip */
if (i2c_read(this->chip, 0x40, 1, &val, 1) || (val & 0x80) != 0 || if (i2c_read(this->chip, 0x40, 1, &val, 1) || (val & 0x80) != 0 ||
i2c_read(this->chip, 0x3E, 1, &val, 1) || val != 0x02) i2c_read(this->chip, 0x3E, 1, &val, 1) || val != 0x02) {
{
printf("Error: LM87 not found at 0x%02X\n", this->chip); printf("Error: LM87 not found at 0x%02X\n", this->chip);
return; return;
} }
/* Configure pins 5,6 as AIN */ /* Configure pins 5,6 as AIN */
val = 0x03; val = 0x03;
if (i2c_write(this->chip, 0x16, 1, &val, 1)) if (i2c_write(this->chip, 0x16, 1, &val, 1)) {
{
printf("Error: can't write LM87 config register\n"); printf("Error: can't write LM87 config register\n");
return; return;
} }
/* Start monitoring */ /* Start monitoring */
val = 0x01; val = 0x01;
if (i2c_write(this->chip, 0x40, 1, &val, 1)) if (i2c_write(this->chip, 0x40, 1, &val, 1)) {
{
printf("Error: can't write LM87 config register\n"); printf("Error: can't write LM87 config register\n");
return; return;
} }
@ -267,8 +259,7 @@ static uint sysmon_i2c_read_sgn (sysmon_t * this, uint addr)
static void sysmon_ccfl_disable (sysmon_table_t * this) static void sysmon_ccfl_disable (sysmon_table_t * this)
{ {
if (!this->val_valid_alt) if (!this->val_valid_alt) {
{
sysmon_temp_invalid = 1; sysmon_temp_invalid = 1;
} }
} }
@ -277,10 +268,9 @@ static void sysmon_ccfl_enable (sysmon_table_t * this)
{ {
ulong reg; ulong reg;
if (!sysmon_temp_invalid) if (!sysmon_temp_invalid) {
{
reg = pic_read (0x60); reg = pic_read (0x60);
reg |= 0x02; reg |= 0x06;
pic_write (0x60, reg); pic_write (0x60, reg);
} }
} }
@ -296,16 +286,13 @@ int sysmon_post_test (int flags)
/* /*
* The A/D conversion on the LM87 sensor takes 300 ms. * The A/D conversion on the LM87 sensor takes 300 ms.
*/ */
if (! conversion_done) if (! conversion_done) {
{
while (post_time_ms(gd->post_init_f_time) < 300) WATCHDOG_RESET (); while (post_time_ms(gd->post_init_f_time) < 300) WATCHDOG_RESET ();
conversion_done = 1; conversion_done = 1;
} }
for (t = sysmon_table; t < sysmon_table + sysmon_table_size; t ++) for (t = sysmon_table; t < sysmon_table + sysmon_table_size; t ++) {
{ if (t->exec_before) {
if (t->exec_before)
{
t->exec_before(t); t->exec_before(t);
} }
@ -313,13 +300,11 @@ int sysmon_post_test (int flags)
t->val_valid = val >= t->val_min && val <= t->val_max; t->val_valid = val >= t->val_min && val <= t->val_max;
t->val_valid_alt = val >= t->val_min_alt && val <= t->val_max_alt; t->val_valid_alt = val >= t->val_min_alt && val <= t->val_max_alt;
if (t->exec_after) if (t->exec_after) {
{
t->exec_after(t); t->exec_after(t);
} }
if ((!t->val_valid) || (flags & POST_MANUAL)) if ((!t->val_valid) || (flags & POST_MANUAL)) {
{
printf("%-17s = %-10s ", t->name, sysmon_unit_value(t, val)); printf("%-17s = %-10s ", t->name, sysmon_unit_value(t, val));
printf("allowed range"); printf("allowed range");
printf(" %-8s ..", sysmon_unit_value(t, t->val_min)); printf(" %-8s ..", sysmon_unit_value(t, t->val_min));
@ -327,8 +312,7 @@ int sysmon_post_test (int flags)
printf(" %s\n", t->val_valid ? "OK" : "FAIL"); printf(" %s\n", t->val_valid ? "OK" : "FAIL");
} }
if (!t->val_valid) if (!t->val_valid) {
{
res = -1; res = -1;
} }
} }