11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* $OpenBSD: bufaux.c,v 1.50 2010/08/31 09:58:37 djm Exp $ */ 21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Author: Tatu Ylonen <ylo@cs.hut.fi> 41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * All rights reserved 61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Auxiliary functions for storing and retrieving various data types to/from 71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Buffers. 81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * As far as I am concerned, the code I have written for this software 101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * can be used freely for any purpose. Any derived versions of this 111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * software must be clearly marked as such, and if the derived work is 121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * incompatible with the protocol description in the RFC file, it must be 131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * called by a name other than "ssh" or "Secure Shell". 141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * SSH2 packet format added by Markus Friedl 171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 2000 Markus Friedl. All rights reserved. 181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without 201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions 211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met: 221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright 231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * notice, this list of conditions and the following disclaimer. 241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright 251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * notice, this list of conditions and the following disclaimer in the 261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * documentation and/or other materials provided with the distribution. 271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h" 411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/types.h> 431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <openssl/bn.h> 451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h> 471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdarg.h> 481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "xmalloc.h" 501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "buffer.h" 511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "log.h" 521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "misc.h" 531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Returns integers from the buffer (msb first). 561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_short_ret(u_short *ret, Buffer *buffer) 601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_char buf[2]; 621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_ret(buffer, (char *) buf, 2) == -1) 641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (-1); 651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *ret = get_u16(buf); 661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodu_short 701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_short(Buffer *buffer) 711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_short ret; 731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_short_ret(&ret, buffer) == -1) 751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_get_short: buffer error"); 761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (ret); 781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_int_ret(u_int *ret, Buffer *buffer) 821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_char buf[4]; 841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_ret(buffer, (char *) buf, 4) == -1) 861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (-1); 871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ret != NULL) 881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *ret = get_u32(buf); 891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodu_int 931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_int(Buffer *buffer) 941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_int ret; 961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_int_ret(&ret, buffer) == -1) 981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_get_int: buffer error"); 991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (ret); 1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_int64_ret(u_int64_t *ret, Buffer *buffer) 1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_char buf[8]; 1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_ret(buffer, (char *) buf, 8) == -1) 1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (-1); 1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ret != NULL) 1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *ret = get_u64(buf); 1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodu_int64_t 1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_int64(Buffer *buffer) 1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_int64_t ret; 1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_int64_ret(&ret, buffer) == -1) 1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_get_int: buffer error"); 1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (ret); 1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Stores integers in the buffer, msb first. 1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_short(Buffer *buffer, u_short value) 1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char buf[2]; 1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood put_u16(buf, value); 1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_append(buffer, buf, 2); 1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_int(Buffer *buffer, u_int value) 1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char buf[4]; 1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood put_u32(buf, value); 1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_append(buffer, buf, 4); 1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_int64(Buffer *buffer, u_int64_t value) 1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char buf[8]; 1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood put_u64(buf, value); 1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_append(buffer, buf, 8); 1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Returns an arbitrary binary string from the buffer. The string cannot 1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * be longer than 256k. The returned value points to memory allocated 1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * with xmalloc; it is the responsibility of the calling function to free 1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * the data. If length_ptr is non-NULL, the length of the returned data 1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * will be stored there. A null character will be automatically appended 1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * to the returned string, and is not counted in length. 1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid * 1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_string_ret(Buffer *buffer, u_int *length_ptr) 1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_char *value; 1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_int len; 1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Get the length. */ 1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_int_ret(&len, buffer) != 0) { 1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood error("buffer_get_string_ret: cannot extract length"); 1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (NULL); 1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (len > 256 * 1024) { 1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood error("buffer_get_string_ret: bad string length %u", len); 1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (NULL); 1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Allocate space for the string. Add one byte for a null character. */ 1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood value = xmalloc(len + 1); 1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Get the string. */ 1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_ret(buffer, value, len) == -1) { 1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood error("buffer_get_string_ret: buffer_get failed"); 1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood xfree(value); 1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (NULL); 1861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Append a null character to make processing easier. */ 1881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood value[len] = '\0'; 1891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Optionally return the length of the string. */ 1901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (length_ptr) 1911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *length_ptr = len; 1921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (value); 1931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid * 1961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_string(Buffer *buffer, u_int *length_ptr) 1971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood void *ret; 1991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if ((ret = buffer_get_string_ret(buffer, length_ptr)) == NULL) 2011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_get_string: buffer error"); 2021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (ret); 2031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar * 2061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr) 2071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_int length; 2091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *cp, *ret = buffer_get_string_ret(buffer, &length); 2101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ret == NULL) 2121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return NULL; 2131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if ((cp = memchr(ret, '\0', length)) != NULL) { 2141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* XXX allow \0 at end-of-string for a while, remove later */ 2151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (cp == ret + length - 1) 2161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood error("buffer_get_cstring_ret: string contains \\0"); 2171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else { 2181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood bzero(ret, length); 2191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood xfree(ret); 2201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return NULL; 2211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (length_ptr != NULL) 2241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *length_ptr = length; 2251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ret; 2261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar * 2291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_cstring(Buffer *buffer, u_int *length_ptr) 2301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *ret; 2321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if ((ret = buffer_get_cstring_ret(buffer, length_ptr)) == NULL) 2341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_get_cstring: buffer error"); 2351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ret; 2361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid * 2391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr) 2401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood void *ptr; 2421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood u_int len; 2431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_int_ret(&len, buffer) != 0) 2451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return NULL; 2461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (len > 256 * 1024) { 2471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood error("buffer_get_string_ptr: bad string length %u", len); 2481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return NULL; 2491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ptr = buffer_ptr(buffer); 2511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_consume(buffer, len); 2521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (length_ptr) 2531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *length_ptr = len; 2541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (ptr); 2551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid * 2581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_string_ptr(Buffer *buffer, u_int *length_ptr) 2591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood void *ret; 2611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL) 2631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_get_string_ptr: buffer error"); 2641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (ret); 2651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 2681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Stores and arbitrary binary string in the buffer. 2691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 2701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 2711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_string(Buffer *buffer, const void *buf, u_int len) 2721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_put_int(buffer, len); 2741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_append(buffer, buf, len); 2751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 2771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_cstring(Buffer *buffer, const char *s) 2781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (s == NULL) 2801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_put_cstring: s == NULL"); 2811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_put_string(buffer, s, strlen(s)); 2821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 2851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Returns a character from the buffer (0 - 255). 2861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 2871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 2881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_char_ret(char *ret, Buffer *buffer) 2891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_ret(buffer, ret, 1) == -1) { 2911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood error("buffer_get_char_ret: buffer_get_ret failed"); 2921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (-1); 2931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 2951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 2981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_char(Buffer *buffer) 2991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 3001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char ch; 3011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 3021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (buffer_get_char_ret(&ch, buffer) == -1) 3031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("buffer_get_char: buffer error"); 3041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (u_char) ch; 3051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 3061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 3071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 3081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Stores a character in the buffer. 3091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 3101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 3111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_char(Buffer *buffer, int value) 3121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 3131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char ch = value; 3141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 3151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood buffer_append(buffer, &ch, 1); 3161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 317