From d2460a8a90224ab8735f6f2d1e1044cf7b0d67ca Mon Sep 17 00:00:00 2001 From: antma Date: Fri, 10 Jan 2014 19:04:27 +0400 Subject: [PATCH 1/2] enhance portability (replace void* by char*) When using void pointers in calculations, the behaviour is undefined. Arithmetic operations on 'void *' is a GNU C extension, which defines the 'sizeof(void)' to be 1. --- main.c | 15 +++++++++++---- mtproto-common.c | 2 +- mtproto-common.h | 2 +- net.c | 9 ++++++--- net.h | 8 ++++---- queries.c | 2 +- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/main.c b/main.c index 56094cc..77a98ba 100644 --- a/main.c +++ b/main.c @@ -180,12 +180,19 @@ char *make_full_path (char *s) { return s; } -void running_for_first_time (void) { - if (sizeof (void) != 1) { - logprintf ("sizeof (void) isn't equal 1\n"); - logprintf ("GNU C compiler extension isn't available?\n"); +void check_type_sizes (void) { + if (sizeof (int) != 4u) { + logprintf ("sizeof (int) isn't equal 4.\n"); exit (1); } + if (sizeof (char) != 1u) { + logprintf ("sizeof (char) isn't equal 1.\n"); + exit (1); + } +} + +void running_for_first_time (void) { + check_type_sizes (); if (config_filename) { return; // Do not create custom config file } diff --git a/mtproto-common.c b/mtproto-common.c index 2d87f83..4ef429f 100644 --- a/mtproto-common.c +++ b/mtproto-common.c @@ -52,7 +52,7 @@ long long rsa_encrypted_chunks, rsa_decrypted_chunks; BN_CTX *BN_ctx; int verbosity; -int get_random_bytes (void *buf, int n) { +int get_random_bytes (unsigned char *buf, int n) { int r = 0, h = open ("/dev/random", O_RDONLY | O_NONBLOCK); if (h >= 0) { r = read (h, buf, n); diff --git a/mtproto-common.h b/mtproto-common.h index 0b8bffd..7cd6691 100644 --- a/mtproto-common.h +++ b/mtproto-common.h @@ -427,7 +427,7 @@ static inline void fetch_ints (void *data, int count) { in_ptr += count; } -int get_random_bytes (void *buf, int n); +int get_random_bytes (unsigned char *buf, int n); int pad_rsa_encrypt (char *from, int from_len, char *to, int size, BIGNUM *N, BIGNUM *E); int pad_rsa_decrypt (char *from, int from_len, char *to, int size, BIGNUM *N, BIGNUM *D); diff --git a/net.c b/net.c index 3ecfa51..ccd5db9 100644 --- a/net.c +++ b/net.c @@ -115,7 +115,8 @@ void delete_connection_buffer (struct connection_buffer *b) { free (b); } -int write_out (struct connection *c, const void *data, int len) { +int write_out (struct connection *c, const void *_data, int len) { + const unsigned char *data = _data; if (!len) { return 0; } assert (len > 0); int x = 0; @@ -146,7 +147,8 @@ int write_out (struct connection *c, const void *data, int len) { return x; } -int read_in (struct connection *c, void *data, int len) { +int read_in (struct connection *c, void *_data, int len) { + unsigned char *data = _data; if (!len) { return 0; } assert (len > 0); if (len > c->in_bytes) { @@ -177,7 +179,8 @@ int read_in (struct connection *c, void *data, int len) { return x; } -int read_in_lookup (struct connection *c, void *data, int len) { +int read_in_lookup (struct connection *c, void *_data, int len) { + unsigned char *data = _data; if (!len || !c->in_bytes) { return 0; } assert (len > 0); if (len > c->in_bytes) { diff --git a/net.h b/net.h index 69a473b..181c46c 100644 --- a/net.h +++ b/net.h @@ -93,10 +93,10 @@ struct dc_serialized { }; struct connection_buffer { - void *start; - void *end; - void *rptr; - void *wptr; + unsigned char *start; + unsigned char *end; + unsigned char *rptr; + unsigned char *wptr; struct connection_buffer *next; }; diff --git a/queries.c b/queries.c index 7eaff00..aa3321b 100644 --- a/queries.c +++ b/queries.c @@ -2329,7 +2329,7 @@ void do_create_keys_end (struct secret_chat *U) { ensure_ptr (a); ensure (BN_mod_exp (r, g_b, a, p, ctx)); - void *t = talloc (256); + unsigned char *t = talloc (256); memcpy (t, U->key, 256); memset (U->key, 0, sizeof (U->key)); From 286ffe8c723344bb8e4bb7759325281597d7b651 Mon Sep 17 00:00:00 2001 From: antma Date: Fri, 10 Jan 2014 20:54:47 +0400 Subject: [PATCH 2/2] fix missed inflateEnd call and enhance handling inflate return value --- mtproto-client.c | 20 +++----------------- queries.c | 21 +++------------------ tools.c | 26 ++++++++++++++++++++++++++ tools.h | 1 + 4 files changed, 33 insertions(+), 35 deletions(-) diff --git a/mtproto-client.c b/mtproto-client.c index 3fc865c..f86fa18 100644 --- a/mtproto-client.c +++ b/mtproto-client.c @@ -40,7 +40,6 @@ #include #include #include -#include #include "net.h" #include "include.h" @@ -1493,26 +1492,13 @@ void work_packed (struct connection *c, long long msg_id) { int l = prefetch_strlen (); char *s = fetch_str (l); - size_t dl = MAX_PACKED_SIZE; - z_stream strm; - memset (&strm, 0, sizeof (strm)); - assert (inflateInit2 (&strm, 16 + MAX_WBITS) == Z_OK); - strm.avail_in = l; - strm.next_in = (void *)s; - strm.avail_out = MAX_PACKED_SIZE; - strm.next_out = (void *)buf; - - int err = inflate (&strm, Z_FINISH); - if (verbosity) { - logprintf ( "inflate error = %d\n", err); - logprintf ( "inflated %d bytes\n", (int)strm.total_out); - } + int total_out = tinflate (s, l, buf, MAX_PACKED_SIZE); int *end = in_ptr; int *eend = in_end; - assert (dl % 4 == 0); + //assert (total_out % 4 == 0); in_ptr = buf; - in_end = in_ptr + strm.total_out / 4; + in_end = in_ptr + total_out / 4; if (verbosity >= 4) { logprintf ( "Unzipped data: "); hexdump_in (); diff --git a/queries.c b/queries.c index aa3321b..8cf357a 100644 --- a/queries.c +++ b/queries.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -215,26 +214,12 @@ void query_result (long long id UU) { fetch_int (); int l = prefetch_strlen (); char *s = fetch_str (l); - size_t dl = MAX_PACKED_SIZE; - - z_stream strm; - memset (&strm, 0, sizeof (strm)); - assert (inflateInit2 (&strm, 16 + MAX_WBITS) == Z_OK); - strm.avail_in = l; - strm.next_in = (void *)s; - strm.avail_out = MAX_PACKED_SIZE; - strm.next_out = (void *)packed_buffer; - - int err = inflate (&strm, Z_FINISH); - if (verbosity) { - logprintf ( "inflate error = %d\n", err); - logprintf ( "inflated %d bytes\n", (int)strm.total_out); - } + int total_out = tinflate (s, l, packed_buffer, MAX_PACKED_SIZE); end = in_ptr; eend = in_end; - assert (dl % 4 == 0); + //assert (total_out % 4 == 0); in_ptr = packed_buffer; - in_end = in_ptr + strm.total_out / 4; + in_end = in_ptr + total_out / 4; if (verbosity >= 4) { logprintf ( "Unzipped data: "); hexdump_in (); diff --git a/tools.c b/tools.c index 748edd5..1970ba9 100644 --- a/tools.c +++ b/tools.c @@ -22,10 +22,13 @@ #include #include #include +#include #include "interface.h" #include "tools.h" +extern int verbosity; + static void out_of_memory (void) { logprintf ("Out of memory\n"); assert (0 && "Out of memory"); @@ -70,3 +73,26 @@ void ensure_ptr (void *p) { out_of_memory (); } } + +int tinflate (void *input, int ilen, void *output, int olen) { + z_stream strm; + memset (&strm, 0, sizeof (strm)); + assert (inflateInit2 (&strm, 16 + MAX_WBITS) == Z_OK); + strm.avail_in = ilen; + strm.next_in = input; + strm.avail_out = olen ; + strm.next_out = output; + int err = inflate (&strm, Z_FINISH), total_out = 0; + if (err == Z_OK || err == Z_STREAM_END) { + total_out = (int) strm.total_out; + if (err == Z_STREAM_END && verbosity >= 2) { + logprintf ( "inflated %d bytes\n", (int) strm.total_out); + } + } + if (verbosity && err != Z_STREAM_END) { + logprintf ( "inflate error = %d\n", err); + logprintf ( "inflated %d bytes\n", (int) strm.total_out); + } + inflateEnd (&strm); + return total_out; +} diff --git a/tools.h b/tools.h index 9753b86..4b3d7dd 100644 --- a/tools.h +++ b/tools.h @@ -24,6 +24,7 @@ void *talloc (size_t size); void *trealloc (void *ptr, size_t size); void *talloc0 (size_t size); char *tstrdup (const char *s); +int tinflate (void *input, int ilen, void *output, int olen); void ensure (int r); void ensure_ptr (void *p);