You are right! The author has a note about that division by zero problem. I just translated the content of the book, but haven't deeply tested it. There is a entire chapter at the end of the book dealing with those errors. It uses integer arithmetic, this is my new translation:

[pascal]function ch_IntersecaSegmentoPlano(
const S1, S2: gr_rVector3D; // Puntos del segmento
const P1: gr_rPlano3D;
var T: Single;
var P: gr_rVector3D
): Boolean;

var
AB: gr_rVector3D;
TN, TD, K: Int64;
V: gr_rVector3D;

begin
Result := False;

{ versi??n de la p?°gina 176:
AB := gr_Resta(S2, S1);
T := (P1.PP-gr_ProductoPunto(P1.N, S1))/gr_ProductoPunto(P1.N, AB);

if (T >= 0) and (T <= 1) then
begin
P := gr_Suma(S1, gr_Multiplica(AB, T));
Exit;
end;

Result := False;
}
AB := gr_Resta(S2, S1);
TN := Trunc(P1.PP-gr_ProductoPunto(P1.N, S1));
TD := Trunc(gr_ProductoPunto(P1.N, AB));

if TD = 0 then Exit;

if TD < 0 then
begin
TN := -TN;
TD := -TD;
end;

if (TN < 0) or (TN > TD) then Exit;

V := gr_CreaVector3D;
K := TD-1;

if TD > 0 then K := -K;
if P1.N.X > 0 then V.X := +K else
if P1.N.X < 0 then V.X := -K;
if P1.N.Y > 0 then V.Y := +K else
if P1.N.Y < 0 then V.Y := -K;
if P1.N.Z > 0 then V.Z := +K else
if P1.N.Z < 0 then V.Z := -K;

P := gr_Suma(S1, gr_Divide(gr_Suma(gr_Multiplica(AB, TN), V), TD));
Result := True;
end;[/pascal]

Please let me know if it works for you, I don't want to have that bug in my code neither.