1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

Add checks for device names in dmsetup and show proper error messages.

Checks added for DM device names to allow only names < DM_NAME_LEN,
otherwise a part of lengthy name would be silently ignored and could
cause confusion while using dmsetup. Also, the name should not contain
'/' character, if it is used in context of creating a new device
or renaming the existing one (because we do not consider full path
to devices, they do not exist in filesystem yet) and appropriate error
messages are shown.
This commit is contained in:
Peter Rajnoha 2009-01-07 12:17:40 +00:00
parent 326902f0c7
commit c48e40391b
3 changed files with 22 additions and 2 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.30 -
====================================
Add checks for device names in dmsetup and show proper error messages.
Replace _dm_snprintf with EMIT_PARAMS macro for creating target lines
Version 1.02.29 - 10th November 2008

View File

@ -1018,6 +1018,16 @@ int dm_task_suppress_identical_reload(struct dm_task *dmt)
int dm_task_set_newname(struct dm_task *dmt, const char *newname)
{
if (strchr(newname, '/')) {
log_error("Name \"%s\" invalid. It contains \"/\".", newname);
return 0;
}
if (strlen(newname) >= DM_NAME_LEN) {
log_error("Name \"%s\" too long", newname);
return 0;
}
if (!(dmt->newname = dm_strdup(newname))) {
log_error("dm_task_set_newname: strdup(%s) failed", newname);
return 0;

View File

@ -143,18 +143,27 @@ int dm_task_set_name(struct dm_task *dmt, const char *name)
* as its last component.
*/
if ((pos = strrchr(name, '/'))) {
if (dmt->type == DM_DEVICE_CREATE) {
log_error("Name \"%s\" invalid. It contains \"/\".", name);
return 0;
}
snprintf(path, sizeof(path), "%s/%s", _dm_dir, pos + 1);
if (stat(name, &st1) || stat(path, &st2) ||
!(st1.st_dev == st2.st_dev)) {
log_error("dm_task_set_name: Device %s not found",
name);
log_error("Device %s not found", name);
return 0;
}
name = pos + 1;
}
if (strlen(name) >= DM_NAME_LEN) {
log_error("Name \"%s\" too long", name);
return 0;
}
if (!(dmt->dev_name = dm_strdup(name))) {
log_error("dm_task_set_name: strdup(%s) failed", name);
return 0;