Buenas,
Tenés razón en lo que decís, el problema es que en el caso de que se encuentra se debería guardar buffdst en una variable auxiliar antes de seguir iterando (dentro de if(!buffdst[jdst].usado and ifree==-1) ). Luego del while se usaría esa variable en lugar de buffdst que como vos decís no tiene por qué tener los datos que se quieren. Otra opción (aunque no estaría tan bien) sería hacer una nueva lectura con el ifree que tenés guardado, eso generaría una lectura innecesaria pero también funcionaría.
Espero que haya quedado claro.
Saludos!