Browse Source

wire: restore BE endian to wire headers for internal messages.

We don't anticipate daemons across machines, but you never know.

Suggested-by: Christian Decker
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 7 years ago
committed by Christian Decker
parent
commit
29b83aed2a
  1. 4
      wire/wire_io.c
  2. 5
      wire/wire_io.h
  3. 12
      wire/wire_sync.c

4
wire/wire_io.c

@ -34,7 +34,7 @@ static int do_read_wire_header(int fd, struct io_plan_arg *arg)
/* Length bytes read? Set up for normal read of data. */ /* Length bytes read? Set up for normal read of data. */
if (arg->u2.s == INSIDE_HEADER_BIT + HEADER_LEN) { if (arg->u2.s == INSIDE_HEADER_BIT + HEADER_LEN) {
arg->u2.s = *(wire_len_t *)p; arg->u2.s = wirelen_to_cpu(*(wire_len_t *)p);
if (arg->u2.s >= INSIDE_HEADER_BIT) { if (arg->u2.s >= INSIDE_HEADER_BIT) {
errno = E2BIG; errno = E2BIG;
return -1; return -1;
@ -88,7 +88,7 @@ static int do_write_wire_header(int fd, struct io_plan_arg *arg)
{ {
ssize_t ret; ssize_t ret;
size_t len = arg->u2.s & ~INSIDE_HEADER_BIT; size_t len = arg->u2.s & ~INSIDE_HEADER_BIT;
wire_len_t hdr = tal_count(arg->u1.const_vp); wire_len_t hdr = cpu_to_wirelen(tal_count(arg->u1.const_vp));
ret = write(fd, (char *)&hdr + len, HEADER_LEN - len); ret = write(fd, (char *)&hdr + len, HEADER_LEN - len);
if (ret <= 0) if (ret <= 0)

5
wire/wire_io.h

@ -2,12 +2,15 @@
#define LIGHTNING_WIRE_WIRE_IO_H #define LIGHTNING_WIRE_WIRE_IO_H
#include "config.h" #include "config.h"
#include <ccan/io/io.h> #include <ccan/io/io.h>
#include <ccan/endian/endian.h>
#include <ccan/short_types/short_types.h> #include <ccan/short_types/short_types.h>
/* We don't allow > 64M msgs: enough for 483 64k failure msgs. */ /* We don't allow > 64M msgs: enough for 483 64k failure msgs. */
#define WIRE_LEN_LIMIT (1 << 26) #define WIRE_LEN_LIMIT (1 << 26)
typedef u32 wire_len_t; typedef be32 wire_len_t;
#define wirelen_to_cpu be32_to_cpu
#define cpu_to_wirelen cpu_to_be32
/* Read message into *data, allocating off ctx. */ /* Read message into *data, allocating off ctx. */
struct io_plan *io_read_wire_(struct io_conn *conn, struct io_plan *io_read_wire_(struct io_conn *conn,

12
wire/wire_sync.c

@ -7,12 +7,12 @@
bool wire_sync_write(int fd, const void *msg TAKES) bool wire_sync_write(int fd, const void *msg TAKES)
{ {
wire_len_t len = tal_len(msg); wire_len_t hdr = cpu_to_wirelen(tal_len(msg));
bool ret; bool ret;
assert(tal_len(msg) < WIRE_LEN_LIMIT); assert(tal_len(msg) < WIRE_LEN_LIMIT);
ret = write_all(fd, &len, sizeof(len)) ret = write_all(fd, &hdr, sizeof(hdr))
&& write_all(fd, msg, len); && write_all(fd, msg, tal_count(msg));
if (taken(msg)) if (taken(msg))
tal_free(msg); tal_free(msg);
@ -26,12 +26,12 @@ u8 *wire_sync_read(const tal_t *ctx, int fd)
if (!read_all(fd, &len, sizeof(len))) if (!read_all(fd, &len, sizeof(len)))
return NULL; return NULL;
if (len >= WIRE_LEN_LIMIT) { if (wirelen_to_cpu(len) >= WIRE_LEN_LIMIT) {
errno = E2BIG; errno = E2BIG;
return NULL; return NULL;
} }
msg = tal_arr(ctx, u8, len); msg = tal_arr(ctx, u8, wirelen_to_cpu(len));
if (!read_all(fd, msg, len)) if (!read_all(fd, msg, wirelen_to_cpu(len)))
return tal_free(msg); return tal_free(msg);
return msg; return msg;
} }

Loading…
Cancel
Save