diff --git a/src/encode.c b/src/encode.c index 4096c3333c11850c660b9ef765cf067a9714dcd0..db08e24cf6bc88691c3de68071e1fed37a276afb 100644 --- a/src/encode.c +++ b/src/encode.c @@ -30,6 +30,7 @@ #include "opcodes.h" #include "peep.h" #include "pike_compiler.h" +#include "bitvector.h" /* #define ENCODE_DEBUG */ @@ -2475,14 +2476,12 @@ static void low_decode_type(struct decode_data *data) case T_INT: { INT32 min=0, max=0; - min = GETC(); - min = (min<<8)|GETC(); - min = (min<<8)|GETC(); - min = (min<<8)|GETC(); - max = GETC(); - max = (max<<8)|GETC(); - max = (max<<8)|GETC(); - max = (max<<8)|GETC(); + if(data->ptr + 8 > data->len) + Pike_error("Decode error: Not enough data in string.\n"); + min = get_unaligned_be32(data->data + data->ptr); + data->ptr += 4; + max = get_unaligned_be32(data->data + data->ptr); + data->ptr += 4; push_int_type(min, max); } break; diff --git a/src/pike_types.c b/src/pike_types.c index c95aef5e85925df90896974ac5203aaeca4f0a44..44a3b499e51d5e8702b8e535789bab77b54d9bd8 100644 --- a/src/pike_types.c +++ b/src/pike_types.c @@ -28,6 +28,7 @@ #include "gc.h" #include "pike_compiler.h" #include "block_allocator.h" +#include "bitvector.h" #ifdef PIKE_DEBUG #define PIKE_TYPE_DEBUG @@ -1380,11 +1381,7 @@ static void push_type_field(TYPE_FIELD field) INT32 extract_type_int(char *p) { - int e; - INT32 ret=0; - for(e=0;e<(int)sizeof(INT32);e++) - ret=(ret<<8) | EXTRACT_UCHAR(p+e); - return ret; + return get_unaligned_be32(p); } struct pike_type *debug_pop_unfinished_type(void) diff --git a/src/post_modules/BSON/bson.cmod b/src/post_modules/BSON/bson.cmod index af97880f9af0e446202f3ccea5a536725002dd09..b9ecba203aa40f30b05edfa13993e5df9ec3d60d 100644 --- a/src/post_modules/BSON/bson.cmod +++ b/src/post_modules/BSON/bson.cmod @@ -22,6 +22,7 @@ #include "interpret.h" #include "mapping.h" #include "module_support.h" +#include "bitvector.h" #include "object.h" #include "pike_macros.h" #include "pike_types.h" @@ -128,25 +129,6 @@ struct svalue * lookup_svalue(const char * prog) DECLARATIONS -/* -** Little endian to host, Long -*/ -static int32_t ltohl(const char *p) -{ - return ((int32_t)((const unsigned char *)p)[0]) | - (((int32_t)((const unsigned char *)p)[1])<<8) | - (((int32_t)((const unsigned char *)p)[2])<<16) | - (((int32_t)((const signed char *)p)[3])<<24); -} - -/* -** Little endian to host, "double" i.e. long long -*/ -static int64_t ltohd(const char *p) -{ - return ((uint32_t)ltohl(p)) | (((int64_t)ltohl(p+4))<<32); -} - struct mapping * decode_document(struct pike_string * pike_slist) { char * slist; @@ -167,7 +149,7 @@ struct mapping * decode_document(struct pike_string * pike_slist) if(left < 4) Pike_error("invalid BSON. not enough data.\n"); - len = ltohl(n); + len = get_unaligned_le32(n); left = pike_slist->len - (n - slist); @@ -246,7 +228,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi struct pike_string * val; int32_t bump; int32_t left; - bump = ltohl(n); + bump = get_unaligned_le32(n); left = pike_slist->len - (n - slist); if(!bump || bump > left) @@ -264,7 +246,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi case TYPE_BSON_BINARY: { struct pike_string * val; - int32_t bump = ltohl(n); + int32_t bump = get_unaligned_le32(n); int32_t left; n+=4; left = pike_slist->len - (n - slist); @@ -287,7 +269,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi { Pike_error("invalid BSON. not enough data 6.\n"); } - t = ltohl(n); + t = get_unaligned_le32(n); push_int(t); n+=4; break; @@ -301,7 +283,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi { Pike_error("invalid BSON. not enough data 7.\n"); } - t = ltohd(n); + t = get_unaligned_le64(n); push_int64(t); n+=8; break; @@ -385,7 +367,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi { Pike_error("invalid BSON. not enough data 9.\n"); } - sec = (uint64_t)ltohd(n); + sec = get_unaligned_le64(n); n+=8; if(!Timestamp) @@ -406,7 +388,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi { Pike_error("invalid BSON. not enough data 10.\n"); } - sec = (uint64_t)ltohd(n); + sec = get_unaligned_le64(n); n+=8; if(!Second) @@ -434,7 +416,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi { Pike_error("invalid BSON. not enough data 11.\n"); } - len = ltohl(n); + len = get_unaligned_le32(n); left = pike_slist->len - (n - slist); if(left < len) @@ -480,7 +462,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi { Pike_error("invalid BSON. not enough data 11.\n"); } - len = ltohl(n); + len = get_unaligned_le32(n); left = pike_slist->len - (n - slist); if(left < len) @@ -524,7 +506,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi case TYPE_BSON_JAVASCRIPT: { struct pike_string * val; - int32_t bump = ltohl(n); + int32_t bump = get_unaligned_le32(n); int32_t left; n+=4; left = pike_slist->len - (n - slist); diff --git a/src/program.c b/src/program.c index 143ad27571d978dcb19b25e50e8ccd8354862bb1..61603ae136556d131436239c491646e3ba8b416f 100644 --- a/src/program.c +++ b/src/program.c @@ -37,6 +37,7 @@ #include "pikecode.h" #include "pike_compiler.h" #include "module_support.h" +#include "bitvector.h" #include <errno.h> #include <fcntl.h> @@ -7225,29 +7226,21 @@ INT_TYPE get_small_number(char **q) /* This is a workaround for buggy cc & Tru64 */ unsigned char *addr = (unsigned char *)*q; INT_TYPE ret = *((signed char *)addr); - ret=*(signed char *)*q; addr++; switch(ret) { case -127: - ret = (((signed char *)addr)[0]<<8) | addr[1]; + ret = (INT16)get_unaligned_be16(addr); addr += 2; if (!ret) { /* 64-bit signed number. */ - ret = *((signed char *)addr++); - ret = (ret<<8) | *(addr++); - ret = (ret<<8) | *(addr++); - ret = (ret<<8) | *(addr++); - ret = (ret<<8) | *(addr++); - ret = (ret<<8) | *(addr++); - ret = (ret<<8) | *(addr++); - ret = (ret<<8) | *(addr++); + ret = get_unaligned_be64(addr); + addr += 8; } break; case -128: - ret = (((signed char *)addr)[0]<<24) | (addr[1]<<16) | - (addr[2]<<8) | addr[3]; + ret = (INT32)get_unaligned_be32(addr); addr += 4; break;