Tito, farmatito at tiscali dot it writes:
Hi to all, I discovered a little bug in hdparm.c (really two little bugs...I've made...sigh! Mea culpa). Some vars were modified only locally and this could lead to wrong results to be displayed with the -I switch and maybe with others. Attached is a patch that fix it ( +88b). Also attached is second patch that reduces the size a little bit: text data bss dec hex filename 27984 624 900 29508 7344 hdparm.o (without bug-fix) 28072 624 900 29596 739c hdparm.o (with bug-fix) 28141 624 900 29665 73e1 hdparm.o (original) but maybe this one can wait as we are in a feature freeze. Ciao, Tito
This commit is contained in:
parent
762c64fdf1
commit
b2aa776f89
@ -544,20 +544,21 @@ static void sync_and_sleep(int i)
|
|||||||
sleep(i);
|
sleep(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_if_min_and_set_val(uint16_t a, uint16_t b)
|
static uint16_t check_if_min_and_set_val(uint16_t a, uint16_t b)
|
||||||
{
|
{
|
||||||
if( a < b)
|
if( a < b)
|
||||||
a = b;
|
a = b;
|
||||||
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_if_maj_and_set_val(uint16_t a, uint16_t b)
|
static uint16_t check_if_maj_and_set_val(uint16_t a, uint16_t b)
|
||||||
{
|
{
|
||||||
if( a > b)
|
if( a > b)
|
||||||
a = b;
|
a = b;
|
||||||
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static unsigned long int set_flag(char *p, char max)
|
||||||
unsigned long int set_flag(char *p, char max)
|
|
||||||
{
|
{
|
||||||
if (*p >= '0' && *p <= max )
|
if (*p >= '0' && *p <= max )
|
||||||
return 1;
|
return 1;
|
||||||
@ -728,7 +729,7 @@ static void identify (uint16_t *id_supplied, const char *devname)
|
|||||||
{
|
{
|
||||||
if(val[MINOR] && (val[MINOR] <= MINOR_MAX))
|
if(val[MINOR] && (val[MINOR] <= MINOR_MAX))
|
||||||
{
|
{
|
||||||
check_if_min_and_set_val( like_std, 3);
|
like_std=check_if_min_and_set_val(like_std, 3);
|
||||||
std = actual_ver[val[MINOR]];
|
std = actual_ver[val[MINOR]];
|
||||||
if_printf(std,"\n\tUsed: %s ",minor_str[val[MINOR]]);
|
if_printf(std,"\n\tUsed: %s ",minor_str[val[MINOR]]);
|
||||||
|
|
||||||
@ -751,17 +752,17 @@ static void identify (uint16_t *id_supplied, const char *devname)
|
|||||||
like_std = ii;
|
like_std = ii;
|
||||||
kk = like_std >4 ? like_std-4: 0;
|
kk = like_std >4 ? like_std-4: 0;
|
||||||
}
|
}
|
||||||
check_if_maj_and_set_val(min_std, ii);
|
min_std=check_if_maj_and_set_val(min_std, ii);
|
||||||
}
|
}
|
||||||
jj <<= 1;
|
jj <<= 1;
|
||||||
}
|
}
|
||||||
check_if_min_and_set_val( like_std, 3);
|
like_std=check_if_min_and_set_val(like_std, 3);
|
||||||
}
|
}
|
||||||
/* Figure out what standard the device is using if it hasn't told
|
/* Figure out what standard the device is using if it hasn't told
|
||||||
* us. If we know the std, check if the device is using any of
|
* us. If we know the std, check if the device is using any of
|
||||||
* the words from the next level up. It happens.
|
* the words from the next level up. It happens.
|
||||||
*/
|
*/
|
||||||
check_if_min_and_set_val( like_std, std);
|
like_std=check_if_min_and_set_val(like_std, std);
|
||||||
|
|
||||||
if(((std == 5) || (!std && (like_std < 6))) &&
|
if(((std == 5) || (!std && (like_std < 6))) &&
|
||||||
((((val[CMDS_SUPP_1] & VALID) == VALID_VAL) &&
|
((((val[CMDS_SUPP_1] & VALID) == VALID_VAL) &&
|
||||||
@ -2104,8 +2105,8 @@ static void process_dev (char *devname)
|
|||||||
{
|
{
|
||||||
unsigned char args[4] = {WIN_SETFEATURES,0,0,0};
|
unsigned char args[4] = {WIN_SETFEATURES,0,0,0};
|
||||||
no_scsi();
|
no_scsi();
|
||||||
check_if_min_and_set_val(apmmode,1);
|
apmmode=check_if_min_and_set_val(apmmode,1);
|
||||||
check_if_maj_and_set_val(apmmode,255);
|
apmmode=check_if_maj_and_set_val(apmmode,255);
|
||||||
if_printf(get_apmmode," setting APM level to");
|
if_printf(get_apmmode," setting APM level to");
|
||||||
if (apmmode==255)
|
if (apmmode==255)
|
||||||
{
|
{
|
||||||
@ -2521,12 +2522,16 @@ static int identify_from_stdin (void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void missing_arg(int arg, char c, char* add)
|
||||||
|
{
|
||||||
|
if (!arg)
|
||||||
|
bb_error_msg("-%c: missing value %s", c, (add!=NULL)? add :"");
|
||||||
|
}
|
||||||
|
|
||||||
/* our main() routine: */
|
/* our main() routine: */
|
||||||
int hdparm_main(int argc, char **argv)
|
int hdparm_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const char * const bb_msg_missing_value ="missing value";
|
|
||||||
char c, *p;
|
char c, *p;
|
||||||
/*int neg;*/
|
|
||||||
|
|
||||||
++argv;
|
++argv;
|
||||||
if (!--argc)
|
if (!--argc)
|
||||||
@ -2638,8 +2643,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if (!*p && argc && isalnum(**argv))
|
if (!*p && argc && isalnum(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
p=GET_NUMBER(p,&set_standby,&standby_requested);
|
p=GET_NUMBER(p,&set_standby,&standby_requested);
|
||||||
if (!set_standby)
|
missing_arg(set_standby, c, NULL);
|
||||||
bb_error_msg("-S: %s", bb_msg_missing_value);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'D':
|
case 'D':
|
||||||
@ -2648,8 +2652,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if (!*p && argc && isalnum(**argv))
|
if (!*p && argc && isalnum(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
p=GET_NUMBER(p,&set_defects,&defects);
|
p=GET_NUMBER(p,&set_defects,&defects);
|
||||||
if (!set_defects)
|
missing_arg(set_defects, c, NULL);
|
||||||
bb_error_msg("-D: %s", bb_msg_missing_value);
|
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
get_prefetch = noisy;
|
get_prefetch = noisy;
|
||||||
@ -2657,8 +2660,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if (!*p && argc && isalnum(**argv))
|
if (!*p && argc && isalnum(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
p=GET_NUMBER(p,&set_prefetch,&prefetch);
|
p=GET_NUMBER(p,&set_prefetch,&prefetch);
|
||||||
if (!set_prefetch)
|
missing_arg(set_prefetch, c, NULL);
|
||||||
bb_error_msg("-P: %s", bb_msg_missing_value);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'X':
|
case 'X':
|
||||||
@ -2667,8 +2669,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if (!*p && argc && isalnum(**argv))
|
if (!*p && argc && isalnum(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
p=GET_STRING(p,&set_xfermode,&xfermode_requested);
|
p=GET_STRING(p,&set_xfermode,&xfermode_requested);
|
||||||
if (!set_xfermode)
|
missing_arg(set_xfermode, c, NULL);
|
||||||
bb_error_msg("-X: %s", bb_msg_missing_value);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'K':
|
case 'K':
|
||||||
@ -2679,7 +2680,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if((set_dkeep = set_flag(p,'1'))==1)
|
if((set_dkeep = set_flag(p,'1'))==1)
|
||||||
dkeep = *p++ - '0';
|
dkeep = *p++ - '0';
|
||||||
else
|
else
|
||||||
bb_error_msg("-K: %s (0/1)", bb_msg_missing_value);
|
goto missing_arg_error;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'A':
|
case 'A':
|
||||||
@ -2690,7 +2691,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if((set_lookahead = set_flag(p,'1'))==1)
|
if((set_lookahead = set_flag(p,'1'))==1)
|
||||||
lookahead = *p++ - '0';
|
lookahead = *p++ - '0';
|
||||||
else
|
else
|
||||||
bb_error_msg("-A: %s (0/1)", bb_msg_missing_value);
|
goto missing_arg_error;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'L':
|
case 'L':
|
||||||
@ -2701,7 +2702,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if((set_doorlock = set_flag(p,'1'))==1)
|
if((set_doorlock = set_flag(p,'1'))==1)
|
||||||
doorlock = *p++ - '0';
|
doorlock = *p++ - '0';
|
||||||
else
|
else
|
||||||
bb_error_msg("-L: %s (0/1)", bb_msg_missing_value);
|
goto missing_arg_error;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'W':
|
case 'W':
|
||||||
@ -2712,7 +2713,8 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if((set_wcache = set_flag(p,'1'))==1)
|
if((set_wcache = set_flag(p,'1'))==1)
|
||||||
wcache = *p++ - '0';
|
wcache = *p++ - '0';
|
||||||
else
|
else
|
||||||
bb_error_msg("-W: %s (0/1)", bb_msg_missing_value);
|
missing_arg_error:
|
||||||
|
missing_arg(1, c, "(0/1)");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'C':
|
case 'C':
|
||||||
@ -2755,7 +2757,7 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if (!*p && argc && isdigit(**argv))
|
if (!*p && argc && isdigit(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
if(! p)
|
if(! p)
|
||||||
goto error; /* "expected hwif_nr" */
|
goto expected_hwif_error; /* "expected hwif_nr" */
|
||||||
|
|
||||||
sscanf(p++, "%i", &hwif);
|
sscanf(p++, "%i", &hwif);
|
||||||
|
|
||||||
@ -2767,21 +2769,21 @@ int hdparm_main(int argc, char **argv)
|
|||||||
if (!*p && argc && isdigit(**argv))
|
if (!*p && argc && isdigit(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
if(! p)
|
if(! p)
|
||||||
goto error; /* "expected hwif_data" */
|
goto expected_hwif_error; /* "expected hwif_data" */
|
||||||
|
|
||||||
sscanf(p++, "%i", &hwif_data);
|
sscanf(p++, "%i", &hwif_data);
|
||||||
|
|
||||||
if (argc && isdigit(**argv))
|
if (argc && isdigit(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
else
|
else
|
||||||
goto error; /* "expected hwif_ctrl" */
|
goto expected_hwif_error; /* "expected hwif_ctrl" */
|
||||||
|
|
||||||
sscanf(p, "%i", &hwif_ctrl);
|
sscanf(p, "%i", &hwif_ctrl);
|
||||||
|
|
||||||
if (argc && isdigit(**argv))
|
if (argc && isdigit(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
else
|
else
|
||||||
error:
|
expected_hwif_error:
|
||||||
bb_error_msg_and_die("expected hwif value"); /* "expected hwif_irq" */
|
bb_error_msg_and_die("expected hwif value"); /* "expected hwif_irq" */
|
||||||
|
|
||||||
sscanf(p, "%i", &hwif_irq);
|
sscanf(p, "%i", &hwif_irq);
|
||||||
@ -2818,7 +2820,7 @@ error:
|
|||||||
if((perform_tristate = set_flag(p,'1'))==1)
|
if((perform_tristate = set_flag(p,'1'))==1)
|
||||||
tristate = *p++ - '0';
|
tristate = *p++ - '0';
|
||||||
else
|
else
|
||||||
bb_error_msg("-x: %s (0/1)", bb_msg_missing_value);
|
missing_arg(1, c, "(0/1)");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#endif /* CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF */
|
#endif /* CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF */
|
||||||
@ -2835,8 +2837,7 @@ error:
|
|||||||
if (!*p && argc && isalnum(**argv))
|
if (!*p && argc && isalnum(**argv))
|
||||||
p = *argv++, --argc;
|
p = *argv++, --argc;
|
||||||
p=GET_NUMBER(p,&set_apmmode,&apmmode);
|
p=GET_NUMBER(p,&set_apmmode,&apmmode);
|
||||||
if (!set_apmmode)
|
missing_arg(set_apmmode, c, "(1-255)");
|
||||||
bb_error_msg("-B: %s (1-255)", bb_msg_missing_value);
|
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
do_timings = 1;
|
do_timings = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user