Messages in this thread Patch in this message | | | Date | Wed, 15 Feb 2012 13:40:45 -0500 | From | Mathieu Desnoyers <> | Subject | [PATCH] char random: fix boot id uniqueness race (v3) |
| |
The proc file /proc/sys/kernel/random/boot_id can be read concurrently by user-space processes. If two (or more) user-space processes concurrently read boot_id when sysctl_bootid is not yet assigned, a race can occur making boot_id differ between the reads. Because the whole point of the boot id is to be unique across a kernel execution, fix this by protecting this operation with a spinlock.
Given that this operation is not frequently used, hitting the spinlock on each call should not be an issue.
* Changelog since v1: - boot_id_mutex is now declared within the proc_do_uuid scope. - added explanation for memory barriers.
* Changelog since v2: - simplify: use spinlock on all paths, suggested by Eric Dumazet.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> CC: "Theodore Ts'o" <tytso@mit.edu> CC: Matt Mackall <mpm@selenic.com> CC: Eric Dumazet <eric.dumazet@gmail.com> CC: Greg Kroah-Hartman <greg@kroah.com> --- drivers/char/random.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
Index: linux-2.6-lttng/drivers/char/random.c =================================================================== --- linux-2.6-lttng.orig/drivers/char/random.c +++ linux-2.6-lttng/drivers/char/random.c @@ -1250,10 +1250,15 @@ static int proc_do_uuid(ctl_table *table uuid = table->data; if (!uuid) { uuid = tmp_uuid; - uuid[8] = 0; - } - if (uuid[8] == 0) generate_random_uuid(uuid); + } else { + static DEFINE_SPINLOCK(bootid_spinlock); + + spin_lock(&bootid_spinlock); + if (!uuid[8]) + generate_random_uuid(uuid); + spin_unlock(&bootid_spinlock); + } sprintf(buf, "%pU", uuid); -- Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com
| |