Fix for segfault when reading /proc/mdstat
Some kernel versions don't put a space between 'active' and '(auto-read-only)' in /proc/mdstat. This causes a parsing problem leaving 'level' set to NULL which causes a crash. So synthesise a space there if it is missing, and check for 'level' to be NULL and don't de-ref if it is.
This commit is contained in:
parent
142cb9e181
commit
2cdb64897d
|
@ -1,3 +1,7 @@
|
||||||
|
Changes Prior to this release
|
||||||
|
- Avoid segfault when parsing /proc/mdstat with auto-read-only
|
||||||
|
arrays.
|
||||||
|
|
||||||
Changes Prior to 2.6.4 release
|
Changes Prior to 2.6.4 release
|
||||||
- Make "--create --auto=mdp" work for non-standard device names.
|
- Make "--create --auto=mdp" work for non-standard device names.
|
||||||
- Fix restarting of a 'reshape' if it was stopped in the middle.
|
- Fix restarting of a 'reshape' if it was stopped in the middle.
|
||||||
|
|
|
@ -332,6 +332,7 @@ int Incremental(char *devname, int verbose, int runstop,
|
||||||
struct supertype *st2;
|
struct supertype *st2;
|
||||||
sra = sysfs_read(mdfd, devnum, (GET_VERSION | GET_DEVS |
|
sra = sysfs_read(mdfd, devnum, (GET_VERSION | GET_DEVS |
|
||||||
GET_STATE));
|
GET_STATE));
|
||||||
|
|
||||||
if (sra->array.major_version != st->ss->major ||
|
if (sra->array.major_version != st->ss->major ||
|
||||||
sra->array.minor_version != st->minor_version) {
|
sra->array.minor_version != st->minor_version) {
|
||||||
if (verbose >= 0)
|
if (verbose >= 0)
|
||||||
|
|
|
@ -403,6 +403,7 @@ int Monitor(mddev_dev_t devlist,
|
||||||
struct mdstat_ent *mse;
|
struct mdstat_ent *mse;
|
||||||
for (mse=mdstat; mse; mse=mse->next)
|
for (mse=mdstat; mse; mse=mse->next)
|
||||||
if (mse->devnum != INT_MAX &&
|
if (mse->devnum != INT_MAX &&
|
||||||
|
mse->level &&
|
||||||
(strcmp(mse->level, "raid0")!=0 &&
|
(strcmp(mse->level, "raid0")!=0 &&
|
||||||
strcmp(mse->level, "linear")!=0)
|
strcmp(mse->level, "linear")!=0)
|
||||||
) {
|
) {
|
||||||
|
|
13
config.c
13
config.c
|
@ -161,11 +161,24 @@ char *conf_word(FILE *file, int allow_key)
|
||||||
word[len++] = c;
|
word[len++] = c;
|
||||||
}
|
}
|
||||||
c = getc(file);
|
c = getc(file);
|
||||||
|
/* Hack for broken kernels (2.6.14-.24) that put
|
||||||
|
* "active(auto-read-only)"
|
||||||
|
* in /proc/mdstat instead of
|
||||||
|
* "active (auto-read-only)"
|
||||||
|
*/
|
||||||
|
if (c == '(' && len >= 6
|
||||||
|
&& strncmp(word+len-6, "active", 6) == 0)
|
||||||
|
c = ' ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (c != EOF) ungetc(c, file);
|
if (c != EOF) ungetc(c, file);
|
||||||
}
|
}
|
||||||
word[len] = 0;
|
word[len] = 0;
|
||||||
|
|
||||||
|
/* Further HACK for broken kernels.. 2.6.14-2.6.24 */
|
||||||
|
if (strcmp(word, "auto-read-only)") == 0)
|
||||||
|
strcpy(word, "(auto-read-only)");
|
||||||
|
|
||||||
/* printf("word is <%s>\n", word); */
|
/* printf("word is <%s>\n", word); */
|
||||||
if (!wordfound) {
|
if (!wordfound) {
|
||||||
free(word);
|
free(word);
|
||||||
|
|
Loading…
Reference in New Issue