Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception 'Bad file descriptor' en utilisant Unix.establish_server #2839

Closed
vicuna opened this issue Jul 16, 2001 · 2 comments
Closed

Exception 'Bad file descriptor' en utilisant Unix.establish_server #2839

vicuna opened this issue Jul 16, 2001 · 2 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Jul 16, 2001

Original bug ID: 438
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Lorsque j'utilise la fonction Unix.establish_server en donnant une
fonction f qui écrit dans le out_channel en paramètre sans faire 'flush
chanout', une erreur non rattrapée 'Sys_error("Bad file descriptor")'
survient dans la fonction Unix.establish_server, lors du 'close_out
outchan' qui se trouve à la fin de la boucle while. La communication
avec le client est du coup brutalement coupée.

Un exemple simple :
foo.ml:

let inet_addr = Unix.inet_addr_of_string "127.0.0.1"
let sock_addr = Unix.ADDR_INET (inet_addr, int_of_string Sys.argv.(1))
let f ic oc = output_string oc "foo"
let _ = Unix.establish_server f sock_addr

compilé par
ocamlc -o server unix.cma foo.ml

on lance le serveur :
./server 2002

un coup de telnet provoque l'erreur :
telnet localhost 2002

Bien sûr dans un programme simple comme

let oc = open_out
let _ = output_string oc "foo"
let _ = close_out oc

cette erreur ne survient pas lors du 'close_out'.

  • Maxence
@vicuna
Copy link
Author

vicuna commented Jul 16, 2001

Comment author: administrator

Lorsque j'utilise la fonction Unix.establish_server en donnant une
fonction f qui écrit dans le out_channel en paramètre sans faire 'flush
chanout',
Et qui laisse donc des donnees dans le buffer.

survient dans la fonction Unix.establish_server, lors du 'close_out
outchan' qui se trouve à la fin de la boucle while.

Normal, puisque le code de unix.ml essaye de fermer deux fois le socket:
] close_in inchan;
] close_out outchan;

Et en plus, dans le mauvais ordre, c'est-a-dire que le socket est ferme
avant qu'on essaye d'ecrire les donnes du buffer de sortie.

C'est fixe dans la version de travail, ainsi que le bug qui consiste a
ne pas faire "exit" dans le fils quand il a fini de travailler...

-- Damien

@vicuna vicuna closed this as completed Jul 16, 2001
@vicuna
Copy link
Author

vicuna commented Jul 16, 2001

Comment author: administrator

Lorsque j'utilise la fonction Unix.establish_server en donnant une
fonction f qui écrit dans le out_channel en paramètre sans faire 'flush
chanout', une erreur non rattrapée 'Sys_error("Bad file descriptor")'
survient dans la fonction Unix.establish_server, lors du 'close_out
outchan' qui se trouve à la fin de la boucle while. La communication
avec le client est du coup brutalement coupée.

En effet, c'est un bug dans establish_server: il faut faire close_out
avant close_in, car les deux canaux font référence au même descripteur
de fichier, et close_out a besoin que le descripteur soit encore
ouvert pour faire flush, alors que close_in s'en fiche.

Je corrige de ce pas.

  • Xavier

@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant