[CRIU] [PATCH] service: allocate buffers for messages dinamically (v2)

Ross Boucher rboucher at gmail.com
Fri Apr 17 07:15:50 PDT 2015


Tested this and it seems to fix my communication issue. Thanks.

On Fri, Apr 17, 2015 at 6:45 AM, Andrey Vagin <avagin at openvz.org> wrote:

> Currently we use a static buffer, but it is too small.
>
> Error (cr-service.c:58): Failed unpacking request: Success
> Error (cr-service.c:694): Can't recv request: Success
> data too short after length-prefix of 1217
>
> v2: use recv instead on recvmsg
>
> Reported-by: Ross Boucher <rboucher at gmail.com>
> Cc: Ross Boucher <rboucher at gmail.com>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  cr-service.c               | 23 +++++++++++++++++------
>  include/cr-service-const.h |  1 -
>  lib/criu.c                 | 19 +++++++++++++++----
>  3 files changed, 32 insertions(+), 11 deletions(-)
>
> diff --git a/cr-service.c b/cr-service.c
> index 0f0e2e2..2173376 100644
> --- a/cr-service.c
> +++ b/cr-service.c
> @@ -7,6 +7,7 @@
>  #include <stdlib.h>
>  #include <errno.h>
>  #include <string.h>
> +#include <alloca.h>
>  #include <sys/types.h>
>  #include <sys/socket.h>
>  #include <sys/un.h>
> @@ -36,12 +37,20 @@
>
>  unsigned int service_sk_ino = -1;
>
> -static int recv_criu_msg(int socket_fd, CriuReq **msg)
> +static int recv_criu_msg(int socket_fd, CriuReq **req)
>  {
> -       unsigned char buf[CR_MAX_MSG_SIZE];
> +       unsigned char *buf;
>         int len;
>
> -       len = read(socket_fd, buf, CR_MAX_MSG_SIZE);
> +       len = recv(socket_fd, NULL, 0, MSG_TRUNC | MSG_PEEK);
> +       if (len == -1) {
> +               pr_perror("Can't read request");
> +               return -1;
> +       }
> +
> +       buf = alloca(len);
> +
> +       len = recv(socket_fd, buf, len, MSG_TRUNC);
>         if (len == -1) {
>                 pr_perror("Can't read request");
>                 return -1;
> @@ -53,8 +62,8 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg)
>                 return -1;
>         }
>
> -       *msg = criu_req__unpack(NULL, len, buf);
> -       if (!*msg) {
> +       *req = criu_req__unpack(NULL, len, buf);
> +       if (!*req) {
>                 pr_perror("Failed unpacking request");
>                 return -1;
>         }
> @@ -64,11 +73,13 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg)
>
>  static int send_criu_msg(int socket_fd, CriuResp *msg)
>  {
> -       unsigned char buf[CR_MAX_MSG_SIZE];
> +       unsigned char *buf;
>         int len;
>
>         len = criu_resp__get_packed_size(msg);
>
> +       buf = alloca(len);
> +
>         if (criu_resp__pack(msg, buf) != len) {
>                 pr_perror("Failed packing response");
>                 return -1;
> diff --git a/include/cr-service-const.h b/include/cr-service-const.h
> index 668882b..b8827f4 100644
> --- a/include/cr-service-const.h
> +++ b/include/cr-service-const.h
> @@ -1,7 +1,6 @@
>  #ifndef __CR_SERVICE_CONST_H__
>  #define __CR_SERVICE_CONST_H__
>
> -#define CR_MAX_MSG_SIZE 1024
>  #define CR_DEFAULT_SERVICE_ADDRESS "/var/run/criu_service.socket"
>
>  #endif /* __CR_SERVICE_CONST_H__ */
> diff --git a/lib/criu.c b/lib/criu.c
> index 9308250..ff7e400 100644
> --- a/lib/criu.c
> +++ b/lib/criu.c
> @@ -10,6 +10,7 @@
>  #include <stdlib.h>
>  #include <errno.h>
>  #include <signal.h>
> +#include <alloca.h>
>
>  #include "criu.h"
>  #include "rpc.pb-c.h"
> @@ -311,13 +312,21 @@ er:
>
>  static CriuResp *recv_resp(int socket_fd)
>  {
> -       unsigned char buf[CR_MAX_MSG_SIZE];
> +       unsigned char *buf;
>         int len;
>         CriuResp *msg = 0;
>
> -       len = read(socket_fd, buf, CR_MAX_MSG_SIZE);
> +       len = recv(socket_fd, NULL, 0, MSG_TRUNC | MSG_PEEK);
>         if (len == -1) {
> -               perror("Can't read response");
> +               perror("Can't read request");
> +               goto err;
> +       }
> +
> +       buf = alloca(len);
> +
> +       len = recv(socket_fd, buf, len, MSG_TRUNC);
> +       if (len == -1) {
> +               perror("Can't read request");
>                 goto err;
>         }
>
> @@ -335,11 +344,13 @@ err:
>
>  static int send_req(int socket_fd, CriuReq *req)
>  {
> -       unsigned char buf[CR_MAX_MSG_SIZE];
> +       unsigned char *buf;
>         int len;
>
>         len = criu_req__get_packed_size(req);
>
> +       buf = alloca(len);
> +
>         if (criu_req__pack(req, buf) != len) {
>                 perror("Failed packing request");
>                 goto err;
> --
> 2.1.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvz.org/pipermail/criu/attachments/20150417/6bedb7b5/attachment.html>


More information about the CRIU mailing list