From 2854254c2f59544d682d41ffee4fc1e1f2a604a3 Mon Sep 17 00:00:00 2001 From: Nick Kralevich Date: Thu, 18 Jun 2009 15:23:17 -0700 Subject: [PATCH] Update RandomBlock to use RandomAccessFile. This helps prevent certain unusual conditions from corrupting the entropy file. (for example, if Android should happen to crash while a write is in progress) --- .../java/com/android/server/RandomBlock.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/services/java/com/android/server/RandomBlock.java b/services/java/com/android/server/RandomBlock.java index c08761ed06032..4ac1c6e21b3fa 100644 --- a/services/java/com/android/server/RandomBlock.java +++ b/services/java/com/android/server/RandomBlock.java @@ -19,12 +19,12 @@ package com.android.server; import android.util.Log; import java.io.Closeable; +import java.io.DataOutput; import java.io.EOFException; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; +import java.io.RandomAccessFile; /** * A 4k block of random {@code byte}s. @@ -63,17 +63,27 @@ class RandomBlock { void toFile(String filename) throws IOException { Log.v(TAG, "writing to file " + filename); - OutputStream out = null; + RandomAccessFile out = null; try { - // TODO: Investigate using RandomAccessFile - out = new FileOutputStream(filename); - toStream(out); + out = new RandomAccessFile(filename, "rws"); + toDataOut(out); + truncateIfPossible(out); } finally { close(out); } } - private void toStream(OutputStream out) throws IOException { + private static void truncateIfPossible(RandomAccessFile f) { + try { + f.setLength(BLOCK_SIZE); + } catch (IOException e) { + // ignore this exception. Sometimes, the file we're trying to + // write is a character device, such as /dev/urandom, and + // these character devices do not support setting the length. + } + } + + private void toDataOut(DataOutput out) throws IOException { out.write(block); }