diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-06-22 01:31:12 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-06-22 01:31:12 +0200 |
commit | 2f86ca135069e457bb16ab9e062a10e0775717a6 (patch) | |
tree | 876df9ba3cf6ac39403cc0f210c0ffab05672049 /util-linux | |
parent | b0bee2b0da4b3270ee5ae6d556c71a6b5ff844bf (diff) | |
download | busybox-w32-2f86ca135069e457bb16ab9e062a10e0775717a6.tar.gz busybox-w32-2f86ca135069e457bb16ab9e062a10e0775717a6.tar.bz2 busybox-w32-2f86ca135069e457bb16ab9e062a10e0775717a6.zip |
mdev: fix the case when move rule deletes node with name == device_name
Signed-off-by: Jean Wolter <jw5@os.inf.tu-dresden.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux')
-rw-r--r-- | util-linux/mdev.c | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/util-linux/mdev.c b/util-linux/mdev.c index 7508930f7..c68c0a5e7 100644 --- a/util-linux/mdev.c +++ b/util-linux/mdev.c | |||
@@ -319,22 +319,20 @@ static void make_device(char *path, int delete) | |||
319 | /* "Execute" the line we found */ | 319 | /* "Execute" the line we found */ |
320 | 320 | ||
321 | if (!delete && major >= 0) { | 321 | if (!delete && major >= 0) { |
322 | if (ENABLE_FEATURE_MDEV_RENAME) | 322 | char *node_name = (char *)device_name; |
323 | unlink(device_name); | 323 | if (ENABLE_FEATURE_MDEV_RENAME && alias) |
324 | if (mknod(device_name, mode | type, makedev(major, minor)) && errno != EEXIST) | 324 | alias = node_name = build_alias(alias, device_name); |
325 | bb_perror_msg_and_die("mknod %s", device_name); | 325 | if (mknod(node_name, mode | type, makedev(major, minor)) && errno != EEXIST) |
326 | bb_perror_msg_and_die("mknod %s", node_name); | ||
326 | if (major == root_major && minor == root_minor) | 327 | if (major == root_major && minor == root_minor) |
327 | symlink(device_name, "root"); | 328 | symlink(node_name, "root"); |
328 | if (ENABLE_FEATURE_MDEV_CONF) { | 329 | if (ENABLE_FEATURE_MDEV_CONF) { |
329 | chmod(device_name, mode); | 330 | chmod(node_name, mode); |
330 | chown(device_name, ugid.uid, ugid.gid); | 331 | chown(node_name, ugid.uid, ugid.gid); |
331 | } | 332 | } |
332 | if (ENABLE_FEATURE_MDEV_RENAME && alias) { | 333 | if (ENABLE_FEATURE_MDEV_RENAME && alias) { |
333 | alias = build_alias(alias, device_name); | 334 | if (aliaslink == '>') |
334 | /* move the device, and optionally | 335 | symlink(node_name, device_name); |
335 | * make a symlink to moved device node */ | ||
336 | if (rename(device_name, alias) == 0 && aliaslink == '>') | ||
337 | symlink(alias, device_name); | ||
338 | free(alias); | 336 | free(alias); |
339 | } | 337 | } |
340 | } | 338 | } |
@@ -355,15 +353,15 @@ static void make_device(char *path, int delete) | |||
355 | } | 353 | } |
356 | 354 | ||
357 | if (delete) { | 355 | if (delete) { |
358 | unlink(device_name); | 356 | char *node_name = (char *)device_name; |
359 | /* At creation time, device might have been moved | ||
360 | * and a symlink might have been created. Undo that. */ | ||
361 | |||
362 | if (ENABLE_FEATURE_MDEV_RENAME && alias) { | 357 | if (ENABLE_FEATURE_MDEV_RENAME && alias) { |
363 | alias = build_alias(alias, device_name); | 358 | alias = node_name = build_alias(alias, device_name); |
364 | unlink(alias); | 359 | if (aliaslink == '>') |
365 | free(alias); | 360 | unlink(device_name); |
366 | } | 361 | } |
362 | unlink(node_name); | ||
363 | if (ENABLE_FEATURE_MDEV_RENAME) | ||
364 | free(alias); | ||
367 | } | 365 | } |
368 | 366 | ||
369 | /* We found matching line. | 367 | /* We found matching line. |