Commit a1ca6efa authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

service: allocate buffers for messages dinamically (v2)

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: 's avatarRoss Boucher <rboucher@gmail.com>
Cc: Ross Boucher <rboucher@gmail.com>
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Acked-by: 's avatarRuslan Kuprieiev <rkuprieiev@cloudlinux.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 1b406338
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <alloca.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/un.h> #include <sys/un.h>
...@@ -36,12 +37,20 @@ ...@@ -36,12 +37,20 @@
unsigned int service_sk_ino = -1; 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; 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) { if (len == -1) {
pr_perror("Can't read request"); pr_perror("Can't read request");
return -1; return -1;
...@@ -53,8 +62,8 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg) ...@@ -53,8 +62,8 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg)
return -1; return -1;
} }
*msg = criu_req__unpack(NULL, len, buf); *req = criu_req__unpack(NULL, len, buf);
if (!*msg) { if (!*req) {
pr_perror("Failed unpacking request"); pr_perror("Failed unpacking request");
return -1; return -1;
} }
...@@ -64,11 +73,13 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg) ...@@ -64,11 +73,13 @@ static int recv_criu_msg(int socket_fd, CriuReq **msg)
static int send_criu_msg(int socket_fd, CriuResp *msg) static int send_criu_msg(int socket_fd, CriuResp *msg)
{ {
unsigned char buf[CR_MAX_MSG_SIZE]; unsigned char *buf;
int len; int len;
len = criu_resp__get_packed_size(msg); len = criu_resp__get_packed_size(msg);
buf = alloca(len);
if (criu_resp__pack(msg, buf) != len) { if (criu_resp__pack(msg, buf) != len) {
pr_perror("Failed packing response"); pr_perror("Failed packing response");
return -1; return -1;
......
#ifndef __CR_SERVICE_CONST_H__ #ifndef __CR_SERVICE_CONST_H__
#define __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" #define CR_DEFAULT_SERVICE_ADDRESS "/var/run/criu_service.socket"
#endif /* __CR_SERVICE_CONST_H__ */ #endif /* __CR_SERVICE_CONST_H__ */
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#include <alloca.h>
#include "criu.h" #include "criu.h"
#include "rpc.pb-c.h" #include "rpc.pb-c.h"
...@@ -311,13 +312,21 @@ er: ...@@ -311,13 +312,21 @@ er:
static CriuResp *recv_resp(int socket_fd) static CriuResp *recv_resp(int socket_fd)
{ {
unsigned char buf[CR_MAX_MSG_SIZE]; unsigned char *buf;
int len; int len;
CriuResp *msg = 0; 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) { 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; goto err;
} }
...@@ -335,11 +344,13 @@ err: ...@@ -335,11 +344,13 @@ err:
static int send_req(int socket_fd, CriuReq *req) static int send_req(int socket_fd, CriuReq *req)
{ {
unsigned char buf[CR_MAX_MSG_SIZE]; unsigned char *buf;
int len; int len;
len = criu_req__get_packed_size(req); len = criu_req__get_packed_size(req);
buf = alloca(len);
if (criu_req__pack(req, buf) != len) { if (criu_req__pack(req, buf) != len) {
perror("Failed packing request"); perror("Failed packing request");
goto err; goto err;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment