#Tcl, 286 bytes#
Tcl, 286 bytes
proc f {o i l} {seek $o 0
set s [string repeat $i $l]
puts -nonewline $o $s
flush $o
seek $o 0
return [string equal [read $o $l] $s]}
set n [open $argv r+]
fconfigure $n -translation binary
seek $n 0 end
set m [tell $n]
while {![f $n "\0" $m]} {}
while {![f $n "\xff" $m]} {}
Not really optimized that well. I tried what I could, but I don't know that much about Tcl.
Save as "f.tcl" and run on Unix with tclsh f.tcl "your filename"
. Make sure there's exactly one argument! I tested this on a plain file, but it should work on a device file as well.
Setting variables and indexing is more involved in Tcl, so I decided to put the common code between the passes into a function. Then I call it first with "\0", and repeat while it fails to verify. I do the same thing with "\xff".
I flushed after writes; it might not be necessary. fconfigure -translation binary -buffering none
is longer.
-2 bytes by removing quotes around r+
.