From ec8b12c7e7c0544c9770b626ee263e58ada9a15d Mon Sep 17 00:00:00 2001 From: Paul Selkirk Date: Thu, 7 Jul 2016 20:02:37 -0400 Subject: Check and propagate XDR error codes, to detect bad request packets. --- hal.h | 2 +- rpc_server.c | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/hal.h b/hal.h index 04dab48..8d4786a 100644 --- a/hal.h +++ b/hal.h @@ -759,7 +759,7 @@ extern hal_error_t hal_rpc_client_init(void); extern hal_error_t hal_rpc_client_close(void); extern hal_error_t hal_rpc_server_init(void); extern hal_error_t hal_rpc_server_close(void); -extern void hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ilen, uint8_t * const obuf, size_t * const olen); +extern hal_error_t hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ilen, uint8_t * const obuf, size_t * const olen); extern void hal_rpc_server_main(void); #endif /* _HAL_H_ */ diff --git a/rpc_server.c b/rpc_server.c index ff6367c..7f6a5f6 100644 --- a/rpc_server.c +++ b/rpc_server.c @@ -647,8 +647,8 @@ static hal_error_t pkey_list(const uint8_t **iptr, const uint8_t * const ilimit, return ret; } -void hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ilen, - uint8_t * const obuf, size_t * const olen) +hal_error_t hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ilen, + uint8_t * const obuf, size_t * const olen) { const uint8_t * iptr = ibuf; const uint8_t * const ilimit = ibuf + ilen; @@ -658,9 +658,9 @@ void hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ilen, uint32_t client_handle; hal_error_t ret; - hal_xdr_decode_int(&iptr, ilimit, &rpc_func_num); - hal_xdr_decode_int(&iptr, ilimit, &client_handle); - hal_xdr_undecode_int(&iptr); + check(hal_xdr_decode_int(&iptr, ilimit, &rpc_func_num)); + check(hal_xdr_decode_int(&iptr, ilimit, &client_handle)); + check(hal_xdr_undecode_int(&iptr)); switch (rpc_func_num) { case RPC_FUNC_GET_VERSION: ret = get_version(&iptr, ilimit, &optr, olimit); @@ -750,9 +750,10 @@ void hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ilen, /* Encode opcode, client ID, and response code at the beginning of the payload */ *olen = optr - obuf; optr = obuf; - hal_xdr_encode_int(&optr, olimit, rpc_func_num); - hal_xdr_encode_int(&optr, olimit, client_handle); - hal_xdr_encode_int(&optr, olimit, ret); + check(hal_xdr_encode_int(&optr, olimit, rpc_func_num)); + check(hal_xdr_encode_int(&optr, olimit, client_handle)); + check(hal_xdr_encode_int(&optr, olimit, ret)); + return HAL_OK; } #define interrupt 0 @@ -770,8 +771,8 @@ void hal_rpc_server_main(void) ret = hal_rpc_recvfrom(inbuf, &ilen, &opaque); if (ret == HAL_OK) { olen = sizeof(outbuf); - hal_rpc_server_dispatch(inbuf, ilen, outbuf, &olen); - hal_rpc_sendto(outbuf, olen, opaque); + if (hal_rpc_server_dispatch(inbuf, ilen, outbuf, &olen) == HAL_OK) + hal_rpc_sendto(outbuf, olen, opaque); } } } -- cgit v1.2.3 From 5780334a373ce55eb9ce977df185234844ac1924 Mon Sep 17 00:00:00 2001 From: Paul Selkirk Date: Fri, 8 Jul 2016 00:29:04 -0400 Subject: Don't reuse local variable in check() macro. --- rpc_server.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rpc_server.c b/rpc_server.c index 7f6a5f6..a0de42d 100644 --- a/rpc_server.c +++ b/rpc_server.c @@ -40,7 +40,7 @@ * RPC calls. */ -#define check(op) if ((ret = (op)) != HAL_OK) return ret; +#define check(op) do { hal_error_t _err = (op); if (_err != HAL_OK) return _err; } while (0) #define pad(n) (((n) + 3) & ~3) @@ -497,7 +497,6 @@ static hal_error_t pkey_get_public_key_len(const uint8_t **iptr, const uint8_t * hal_client_handle_t client __attribute__((unused)); hal_pkey_handle_t pkey; size_t len; - hal_error_t ret; check(hal_xdr_decode_int(iptr, ilimit, &client.handle)); check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle)); -- cgit v1.2.3