From: Willy Tarreau Date: Thu, 11 Apr 2013 14:14:13 +0000 (+0200) Subject: CLEANUP: peers: remove a bit of spaghetti to prepare for the next bugfix X-Git-Tag: v1.5-dev19~72 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=72d6c16df44dab50fd5de286864f489801e1db2d;p=thirdparty%2Fhaproxy.git CLEANUP: peers: remove a bit of spaghetti to prepare for the next bugfix We'll need to centralize some pool_alloc()/pool_free() calls in the upcoming fix so before that we need to reduce the number of points by which we leave the critical code. --- diff --git a/src/peers.c b/src/peers.c index 789fa8c57f..58248bba6f 100644 --- a/src/peers.c +++ b/src/peers.c @@ -600,14 +600,9 @@ switchstate: int totl = 0; reql = bo_getblk(si->ob, (char *)&c, sizeof(c), totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - /* nothing to read */ - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; if ((c & 0x80) || (c == 'D')) { @@ -625,13 +620,9 @@ switchstate: } else { reql = bo_getblk(si->ob, (char *)&netinteger, sizeof(netinteger), totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; pushack = ntohl(netinteger); } @@ -642,24 +633,16 @@ switchstate: stkey.key = stkey.data.buf; reql = bo_getblk(si->ob, (char *)&netinteger, sizeof(netinteger), totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; stkey.key_len = ntohl(netinteger); reql = bo_getblk(si->ob, stkey.key, stkey.key_len, totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; } else if (ps->table->table->type == STKTABLE_TYPE_INTEGER) { @@ -668,13 +651,9 @@ switchstate: stkey.key = &stkey.data.integer; reql = bo_getblk(si->ob, (char *)&netinteger, sizeof(netinteger), totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; stkey.data.integer = ntohl(netinteger); } @@ -684,26 +663,17 @@ switchstate: stkey.key = stkey.data.buf; reql = bo_getblk(si->ob, (char *)&stkey.data.buf, ps->table->table->key_size, totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } - totl += reql; + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; } /* read server id */ reql = bo_getblk(si->ob, (char *)&netinteger, sizeof(netinteger), totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; srvid = ntohl(netinteger); @@ -806,13 +776,9 @@ switchstate: uint32_t netinteger; reql = bo_getblk(si->ob, (char *)&netinteger, sizeof(netinteger), totl); - if (reql <= 0) { /* closed or EOL not found */ - if (reql == 0) { - goto incomplete; - } - si->applet.st0 = PEER_SESSION_END; - goto switchstate; - } + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + totl += reql; /* Consider remote is up to date with "acked" version */ @@ -828,8 +794,16 @@ switchstate: bo_skip(si->ob, totl); /* loop on that state to peek next message */ - continue; + goto switchstate; + incomplete: + /* we get here when a bo_getblk() returns <= 0 */ + if (reql < 0) { + /* there was an error */ + si->applet.st0 = PEER_SESSION_END; + goto switchstate; + } + /* Nothing to read, now we start to write */ /* Confirm finished or partial messages */