X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibmemcachedprotocol%2Fpedantic.c;h=c966ee8bb8fed9e5ba36d1896f80e8edb9ea92f3;hb=b9748819d603f9d5c1dc54730ef38b6ee6d63ca4;hp=54a2add0b96e44edfb8b9d6e9fa36b290d6f6d38;hpb=5e760300d15ef4c5b7eed3fb9f37920ebca2f6ec;p=m6w6%2Flibmemcached diff --git a/src/libmemcachedprotocol/pedantic.c b/src/libmemcachedprotocol/pedantic.c index 54a2add0..c966ee8b 100644 --- a/src/libmemcachedprotocol/pedantic.c +++ b/src/libmemcachedprotocol/pedantic.c @@ -1,58 +1,38 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Libmemcached library - * - * Copyright (C) 2011 Data Differential, http://datadifferential.com/ - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * - * * The names of its contributors may not be used to endorse or - * promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */ -#include - -#include - -#define ensure(a) if (!(a)) { return false; } - -bool memcached_binary_protocol_pedantic_check_request(const protocol_binary_request_header *request) -{ +/* + +--------------------------------------------------------------------+ + | libmemcached - C/C++ Client Library for memcached | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted under the terms of the BSD license. | + | You should have received a copy of the license in a bundled file | + | named LICENSE; in case you did not receive a copy you can review | + | the terms online at: https://opensource.org/licenses/BSD-3-Clause | + +--------------------------------------------------------------------+ + | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ | + | Copyright (c) 2020 Michael Wallner | + +--------------------------------------------------------------------+ +*/ + +#include "libmemcachedprotocol/common.h" +#include "p9y/socket.hpp" + +#define ensure(a) \ + if (!(a)) { \ + return false; \ + } + +bool memcached_binary_protocol_pedantic_check_request( + const protocol_binary_request_header *request) { ensure(request->request.magic == PROTOCOL_BINARY_REQ); ensure(request->request.datatype == PROTOCOL_BINARY_RAW_BYTES); ensure(request->bytes[6] == 0); ensure(request->bytes[7] == 0); - uint8_t opcode= request->request.opcode; - uint16_t keylen= ntohs(request->request.keylen); - uint8_t extlen= request->request.extlen; - uint32_t bodylen= ntohl(request->request.bodylen); + uint8_t opcode = request->request.opcode; + uint16_t keylen = ntohs(request->request.keylen); + uint8_t extlen = request->request.extlen; + uint32_t bodylen = ntohl(request->request.bodylen); ensure(bodylen >= (keylen + extlen)); @@ -125,26 +105,26 @@ bool memcached_binary_protocol_pedantic_check_request(const protocol_binary_requ ensure(extlen == 0); ensure(keylen > 0); break; - default: - /* Unknown command */ - ; + default + : + /* Unknown command */ + ; } return true; } -bool memcached_binary_protocol_pedantic_check_response(const protocol_binary_request_header *request, - const protocol_binary_response_header *response) -{ +bool memcached_binary_protocol_pedantic_check_response( + const protocol_binary_request_header *request, + const protocol_binary_response_header *response) { ensure(response->response.magic == PROTOCOL_BINARY_RES); ensure(response->response.datatype == PROTOCOL_BINARY_RAW_BYTES); ensure(response->response.opaque == request->request.opaque); - uint16_t status= ntohs(response->response.status); - uint8_t opcode= response->response.opcode; + uint16_t status = ntohs(response->response.status); + uint8_t opcode = response->response.opcode; - if (status == PROTOCOL_BINARY_RESPONSE_SUCCESS) - { + if (status == PROTOCOL_BINARY_RESPONSE_SUCCESS) { switch (opcode) { case PROTOCOL_BINARY_CMD_ADDQ: case PROTOCOL_BINARY_CMD_APPENDQ: @@ -171,7 +151,7 @@ bool memcached_binary_protocol_pedantic_check_response(const protocol_binary_req ensure(response->response.keylen == 0); ensure(response->response.extlen == 0); ensure(response->response.bodylen == 0); - ensure(response->response.cas != 0); + ensure(response->response.cas); break; case PROTOCOL_BINARY_CMD_FLUSH: case PROTOCOL_BINARY_CMD_NOOP: @@ -188,7 +168,7 @@ bool memcached_binary_protocol_pedantic_check_response(const protocol_binary_req ensure(response->response.keylen == 0); ensure(response->response.extlen == 0); ensure(ntohl(response->response.bodylen) == 8); - ensure(response->response.cas != 0); + ensure(response->response.cas); break; case PROTOCOL_BINARY_CMD_STAT: @@ -200,7 +180,7 @@ bool memcached_binary_protocol_pedantic_check_response(const protocol_binary_req case PROTOCOL_BINARY_CMD_VERSION: ensure(response->response.keylen == 0); ensure(response->response.extlen == 0); - ensure(response->response.bodylen != 0); + ensure(response->response.bodylen); ensure(response->response.cas == 0); break; @@ -208,27 +188,24 @@ bool memcached_binary_protocol_pedantic_check_response(const protocol_binary_req case PROTOCOL_BINARY_CMD_GETQ: ensure(response->response.keylen == 0); ensure(response->response.extlen == 4); - ensure(response->response.cas != 0); + ensure(response->response.cas); break; case PROTOCOL_BINARY_CMD_GETK: case PROTOCOL_BINARY_CMD_GETKQ: - ensure(response->response.keylen != 0); + ensure(response->response.keylen); ensure(response->response.extlen == 4); - ensure(response->response.cas != 0); + ensure(response->response.cas); break; default: /* Undefined command code */ break; } - } - else - { + } else { ensure(response->response.cas == 0); ensure(response->response.extlen == 0); - if (opcode != PROTOCOL_BINARY_CMD_GETK) - { + if (opcode != PROTOCOL_BINARY_CMD_GETK) { ensure(response->response.keylen == 0); } }