Re: [Nbd] [PATCH 05/11] nbd-server: treat accept errors as non-fatal
- To: Wouter Verhelst <w@...112...>
- Cc: nbd-general@lists.sourceforge.net
- Subject: Re: [Nbd] [PATCH 05/11] nbd-server: treat accept errors as non-fatal
- From: "Dmitry V. Levin" <ldv@...1147...>
- Date: Mon, 25 Jun 2012 02:47:20 +0400
- Message-id: <20120624224720.GA28212@...1147...>
- In-reply-to: <20120623233128.GK7471@...3...>
- References: <20120621214048.GE26247@...1147...> <20120623233128.GK7471@...3...>
On Sun, Jun 24, 2012 at 01:31:28AM +0200, Wouter Verhelst wrote:
> On Fri, Jun 22, 2012 at 01:40:48AM +0400, Dmitry V. Levin wrote:
> > In most cases, an error returned by accept system call is a network
> > error, which should not terminate the whole nbd-server.
>
> Yes, that's a leftover from the days when nbd-server ran in
> one-process-per-export mode (i.e., the 2.7 days). Oops.
Then there is at least one more issue of this kind:
>From a2e158154fd743fb039e0823736774804a9645ac Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@...1147...>
Date: Sun, 24 Jun 2012 22:40:54 +0000
Subject: [PATCH] nbd-server: treat getpeername errors as non-fatal
In most cases, an error returned by getpeername system call is a network
error, which should not terminate the whole nbd-server.
---
nbd-server.c | 21 ++++++++++++++-------
1 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/nbd-server.c b/nbd-server.c
index fc5ae2d..49822a7 100644
--- a/nbd-server.c
+++ b/nbd-server.c
@@ -2055,8 +2055,9 @@ void serveconnection(CLIENT *client) {
* @param client information about the client. The IP address in human-readable
* format will be written to a new char* buffer, the address of which will be
* stored in client->clientname.
+ * @return: 0 - OK, -1 - failed.
**/
-void set_peername(int net, CLIENT *client) {
+int set_peername(int net, CLIENT *client) {
struct sockaddr_storage addrin;
struct sockaddr_storage netaddr;
struct sockaddr_in *netaddr4 = NULL;
@@ -2071,13 +2072,15 @@ void set_peername(int net, CLIENT *client) {
int e;
int shift;
- if (getpeername(net, (struct sockaddr *) &addrin, &addrinlen) < 0)
- err("getpeername failed: %m");
+ if (getpeername(net, (struct sockaddr *) &addrin, &addrinlen) < 0) {
+ msg2(LOG_INFO, "getpeername failed: %m");
+ return -1;
+ }
if((e = getnameinfo((struct sockaddr *)&addrin, addrinlen,
peername, sizeof (peername), NULL, 0, NI_NUMERICHOST))) {
msg3(LOG_INFO, "getnameinfo failed: %s", gai_strerror(e));
- freeaddrinfo(ai);
+ return -1;
}
memset(&hints, '\0', sizeof (hints));
@@ -2087,7 +2090,7 @@ void set_peername(int net, CLIENT *client) {
if(e != 0) {
msg3(LOG_INFO, "getaddrinfo failed: %s", gai_strerror(e));
freeaddrinfo(ai);
- return;
+ return -1;
}
switch(client->server->virtstyle) {
@@ -2145,6 +2148,7 @@ void set_peername(int net, CLIENT *client) {
msg4(LOG_INFO, "connect from %s, assigned file is %s",
peername, client->exportname);
client->clientname=g_strdup(peername);
+ return 0;
}
/**
@@ -2181,7 +2185,9 @@ handle_connection(GArray *servers, int net, SERVER *serve, CLIENT *client)
client->net=net;
client->transactionlogfd = -1;
}
- set_peername(net, client);
+ if (set_peername(net, client)) {
+ goto handle_connection_out;
+ }
if (!authorized_client(client)) {
msg2(LOG_INFO,"Unauthorized client") ;
goto handle_connection_out;
@@ -2626,7 +2632,8 @@ int main(int argc, char *argv[]) {
client->server=serve;
client->net=-1;
client->exportsize=OFFT_MAX;
- set_peername(0,client);
+ if (set_peername(0, client))
+ exit(EXIT_FAILURE);
serveconnection(client);
return 0;
}
--
ldv
Reply to: