diff --git a/src/replication.c b/src/replication.c index 0b7d579109a37af89b40666379c8076080d2e2c5..5b344f49ec4704034b40c5455f2d4830d472b13e 100644 --- a/src/replication.c +++ b/src/replication.c @@ -1315,23 +1315,30 @@ error: #define SYNC_CMD_FULL (SYNC_CMD_READ|SYNC_CMD_WRITE) char *sendSynchronousCommand(int flags, int fd, ...) { - /* Create the command to send to the master, we use simple inline - * protocol for simplicity as currently we only send simple strings. */ + /* Create the command to send to the master, we use redis binary + * protocol to make sure correct arguments are sent. This function + * is not safe for all binary data.*/ if (flags & SYNC_CMD_WRITE) { char *arg; va_list ap; sds cmd = sdsempty(); + sds cmdargs = sdsempty(); + int argslen = 0; va_start(ap,fd); while(1) { arg = va_arg(ap, char*); if (arg == NULL) break; - if (sdslen(cmd) != 0) cmd = sdscatlen(cmd," ",1); - cmd = sdscat(cmd,arg); + cmdargs = sdscatprintf(cmdargs,"$%zu\r\n%s\r\n",strlen(arg),arg); + argslen++; } - cmd = sdscatlen(cmd,"\r\n",2); + va_end(ap); + + cmd = sdscatprintf(cmd,"*%zu\r\n",argslen); + cmd = sdscatsds(cmd,cmdargs); + sdsfree(cmdargs); /* Transfer command to the server. */ if (syncWrite(fd,cmd,sdslen(cmd),server.repl_syncio_timeout*1000)