No entiendo porque dices que el ciclo es infinito, ahora lo he probado y funciona bien.
Ten en cuenta que
mysql_fetch_array devueve un registro de la consulta como array hasta que encuentra el final que es cuando devueve false, con lo cual es lógico mi razonamiento de preguntar solo por el estado de
$row.
Probalo y vas a ver que funciona bien.
Código PHP:
$row = mysql_fetch_array($query);
while ($row)
{
// Código...
$row = mysql_fetch_array($query);
}