From: Yehuda Sadeh Date: Thu, 25 Jun 2015 21:31:03 +0000 (-0700) Subject: rgw: error out if frontend did not send all data X-Git-Tag: v9.0.2~8^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=daa679c3dd3770a6d5421e2cc9a36924f4550439;p=ceph.git rgw: error out if frontend did not send all data Fixes: #11851 The civetweb mg_write() doesn't return error when it can't flush all data to the user, it just sends the total number of bytes written. Modified the client io to return total number of bytes and return an error if didn't send anything. Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_civetweb.cc b/src/rgw/rgw_civetweb.cc index 1495e92d4741..827709b993b3 100644 --- a/src/rgw/rgw_civetweb.cc +++ b/src/rgw/rgw_civetweb.cc @@ -13,13 +13,18 @@ int RGWMongoose::write_data(const char *buf, int len) { if (!header_done) { header_data.append(buf, len); - return 0; + return len; } if (!sent_header) { data.append(buf, len); - return 0; + return len; + } + int r = mg_write(conn, buf, len); + if (r == 0) { + /* didn't send anything, error out */ + return -EIO; } - return mg_write(conn, buf, len); + return r; } RGWMongoose::RGWMongoose(mg_connection *_conn, int _port) : conn(_conn), port(_port), header_done(false), sent_header(false), has_content_length(false), diff --git a/src/rgw/rgw_client_io.cc b/src/rgw/rgw_client_io.cc index 5e8edbf31123..1f8b803a3d40 100644 --- a/src/rgw/rgw_client_io.cc +++ b/src/rgw/rgw_client_io.cc @@ -56,7 +56,12 @@ int RGWClientIO::write(const char *buf, int len) return ret; if (account) - bytes_sent += len; + bytes_sent += ret; + + if (ret < len) { + /* sent less than tried to send, error out */ + return -EIO; + } return 0; }