eio.c bug - use of errno without testing result

Micheil Smith micheil at brandedcode.com
Fri Oct 29 15:48:34 CEST 2010


Hi Marc,

Actually, I read the wrong documentation. So, in node, we currently have a pretty 
much global After callback, which does:

	static int After(eio_req *req) {
	  // ...
	  ev_unref(EV_DEFAULT_UC);
	  // ...
	  if (req->errorno != 0) {
	     // throw error
	  } else {
	     // call JS function as callback.
	  }
	  // ...
	}

Are you suggesting we should actually be doing something like:

	static int After(eio_req *req) {
	  // ...
	  ev_unref(EV_DEFAULT_UC);
	  // ...
	  if (req->result != EXPECTED_RESULT) {
	     // throw error
	  } else {
	     // call JS function as callback.
	  }
	  // ...
	}

Where EXPECTED_RESULT is the result int that we would expect given req->type?

Yours,
Micheil Smith
--
BrandedCode.com

On 30/10/2010, at 12:40 AM, Micheil Smith wrote:

> Hi Marc,
> 
> Given something like a call to EIO_OPEN, how should we be checking for an error, 
> would I be right in thinking that we should look at ev_set_syserr_cb?
> 
> because if error handling can be improved, I'd be all for learning how to improve it.
> 
> Thanks,
> Micheil Smith
> --
> BrandedCode.com
> 
> On 30/10/2010, at 12:30 AM, Marc Lehmann wrote:
> 
>> On Fri, Oct 29, 2010 at 02:40:51AM -0700, Liam <libev at networkimprov.net> wrote:
>>> The issue is... because sendfile(2) on Linux and FreeBSD succeed but set an
>>> erroneous errno, an app which simply checks the eio req->errorno to decide
>>> if there's an error may fail. Node.js does this as it provides callbacks
>>> with either an error or data, never both.
>> 
>> Then node.js is horribly broken on any OS, with any syscall, not just
>> sendfile.
>> 
>>> Since eio is supports multiple OSes, one might expect it to hide OS
>>> eccentricities?
>> 
>> It works like any other syscall actually, no syscall clears errno, node.js is
>> simply broken if it uses errno to test for failure.
>> 
>> To test for failure, one has to check the return value of the call. errno
>> only tells you _how_ something failed, not _whether_ something failed.
>> 
>> And that's the same for any syscall on any OS.
>> 
>> It would be rather eccentric if it did, in fact :)
>> 
>> -- 
>>               The choice of a       Deliantra, the free code+content MORPG
>>     -----==-     _GNU_              http://www.deliantra.net
>>     ----==-- _       generation
>>     ---==---(_)__  __ ____  __      Marc Lehmann
>>     --==---/ / _ \/ // /\ \/ /      schmorp at schmorp.de
>>     -=====/_/_//_/\_,_/ /_/\_\
>> 
>> _______________________________________________
>> libev mailing list
>> libev at lists.schmorp.de
>> http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
> 




More information about the libev mailing list