Module Name: src Committed By: alnsn Date: Sat Apr 30 12:25:05 UTC 2011
Modified Files: src/lib/librumpclient: rumpclient.c Log Message: Save/restore errno in error path in dupgood. Check that n>0 before accessing banner[n-1]. Approved a while ago by pooka@ To generate a diff of this commit: cvs rdiff -u -r1.44 -r1.45 src/lib/librumpclient/rumpclient.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/librumpclient/rumpclient.c diff -u src/lib/librumpclient/rumpclient.c:1.44 src/lib/librumpclient/rumpclient.c:1.45 --- src/lib/librumpclient/rumpclient.c:1.44 Tue Mar 15 09:35:05 2011 +++ src/lib/librumpclient/rumpclient.c Sat Apr 30 12:25:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpclient.c,v 1.44 2011/03/15 09:35:05 pooka Exp $ */ +/* $NetBSD: rumpclient.c,v 1.45 2011/04/30 12:25:05 alnsn Exp $ */ /* * Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: rumpclient.c,v 1.44 2011/03/15 09:35:05 pooka Exp $"); +__RCSID("$NetBSD: rumpclient.c,v 1.45 2011/04/30 12:25:05 alnsn Exp $"); #include <sys/param.h> #include <sys/event.h> @@ -589,6 +589,7 @@ { int ofds[4]; int i; + int sverrno; for (i = 0; (myfd <= 2 || mustchange) && myfd != -1; i++) { assert(i < __arraycount(ofds)); @@ -600,10 +601,17 @@ } } + sverrno = 0; + if (myfd == -1 && i > 0) + sverrno = errno; + for (i--; i >= 0; i--) { host_close(ofds[i]); } + if (sverrno) + errno = sverrno; + return myfd; } @@ -673,7 +681,7 @@ return -1; } - if ((n = host_read(s, banner, sizeof(banner)-1)) < 0) { + if ((n = host_read(s, banner, sizeof(banner)-1)) <= 0) { ERRLOG(("rump_sp: failed to read banner\n")); return -1; } @@ -683,7 +691,7 @@ return -1; } banner[n] = '\0'; - /* parse the banner some day */ + /* XXX parse the banner some day */ flags = host_fcntl(s, F_GETFL, 0); if (host_fcntl(s, F_SETFL, flags | O_NONBLOCK) == -1) {