Order opt_list in opt_new() call order, limit items to OPT_NMAX

This commit is contained in:
Alexandre Ratchov 2021-01-08 16:33:37 +01:00
parent 8e99cca36c
commit e891595ec7
2 changed files with 23 additions and 11 deletions

View File

@ -30,17 +30,10 @@ opt_new(struct dev *d, char *name,
int pmin, int pmax, int rmin, int rmax,
int maxweight, int mmc, int dup, unsigned int mode)
{
struct opt *o;
unsigned int len;
struct opt *o, **po;
unsigned int len, num;
char c;
if (opt_byname(d, name)) {
dev_log(d);
log_puts(".");
log_puts(name);
log_puts(": already defined\n");
return NULL;
}
for (len = 0; name[len] != '\0'; len++) {
if (len == OPT_NAMEMAX) {
log_puts(name);
@ -55,7 +48,23 @@ opt_new(struct dev *d, char *name,
return NULL;
}
}
num = 0;
for (po = &opt_list; *po != NULL; po = &(*po)->next)
num++;
if (num >= OPT_NMAX) {
log_puts(name);
log_puts(": too many opts\n");
return NULL;
}
if (opt_byname(d, name)) {
dev_log(d);
log_puts(".");
log_puts(name);
log_puts(": already defined\n");
return NULL;
}
o = xmalloc(sizeof(struct opt));
o->num = num;
o->dev = d;
if (mode & MODE_PLAY) {
o->pmin = pmin;
@ -70,8 +79,8 @@ opt_new(struct dev *d, char *name,
o->dup = dup;
o->mode = mode;
memcpy(o->name, name, len + 1);
o->next = opt_list;
opt_list = o;
o->next = *po;
*po = o;
if (log_level >= 2) {
dev_log(d);
log_puts(".");

View File

@ -17,11 +17,14 @@
#ifndef OPT_H
#define OPT_H
#define OPT_NMAX 16
struct dev;
struct opt {
struct opt *next;
struct dev *dev;
int num;
#define OPT_NAMEMAX 11
char name[OPT_NAMEMAX + 1];
int maxweight; /* max dynamic range for clients */