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:
parent
326902f0c7
commit
c48e40391b
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user