summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <daniel.friesel@uos.de>2019-06-28 13:48:26 +0200
committerDaniel Friesel <daniel.friesel@uos.de>2019-06-28 13:48:26 +0200
commit5981641a3715468f60518a2f4fef45e5848a8d1e (patch)
tree39dde8f435c47a525900f93846abf637967202d2
parente1058170fa9f221c827ab99d8856080648812a88 (diff)
correctly encode and decode integers
-rw-r--r--src/lib/xdr.cc59
-rw-r--r--src/lib/xdr16.cc62
2 files changed, 62 insertions, 59 deletions
diff --git a/src/lib/xdr.cc b/src/lib/xdr.cc
index 180bff0..10d265f 100644
--- a/src/lib/xdr.cc
+++ b/src/lib/xdr.cc
@@ -1,6 +1,5 @@
#include "lib/xdr.h"
-
void XDRWriter::put(uint32_t number)
{
*buffer++ = ((number >> 24) & 0xffU);
@@ -69,30 +68,38 @@ void XDRWriter::put(double number)
put(v.i);
}
-void XDRWriter::put(char const *data){
- if (!is_fixed_length) {
+void XDRWriter::put(char const *data)
+{
+ if (!is_fixed_length)
+ {
put(next_array_len);
}
uint32_t i;
- for (i = 0; i < next_array_len; i++) {
+ for (i = 0; i < next_array_len; i++)
+ {
*buffer++ = data[i];
}
- while ((i++) % 4 != 0){
+ while ((i++) % 4 != 0)
+ {
*buffer++ = 0;
}
pos += i;
}
-template<uint32_t TSize>
-void XDRWriter::put(char const (&data)[TSize]){
- if (!is_fixed_length) {
+template <uint32_t TSize>
+void XDRWriter::put(char const (&data)[TSize])
+{
+ if (!is_fixed_length)
+ {
put(TSize);
}
uint32_t i;
- for (i = 0; i < TSize; i++) {
+ for (i = 0; i < TSize; i++)
+ {
*buffer++ = data[i];
}
- while ((i++) % 4 != 0){
+ while ((i++) % 4 != 0)
+ {
*buffer++ = 0;
}
pos += i;
@@ -100,37 +107,28 @@ void XDRWriter::put(char const (&data)[TSize]){
uint32_t XDRReader::get_uint32()
{
- uint32_t ret = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
- | ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
+ uint32_t ret = (((uint32_t)data[pos] & 0xffU) << 24) | (((uint32_t)data[pos + 1] & 0xffU) << 16) | (((uint32_t)data[pos + 2] & 0xffU) << 8) | ((uint32_t)data[pos + 3] & 0xffU);
pos += 4;
return ret;
}
int32_t XDRReader::get_int32()
{
- int32_t ret = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
+ int32_t ret = (((int32_t)data[pos] & 0xff) << 24) | (((int32_t)data[pos + 1] & 0xff) << 16) | (((int32_t)data[pos + 2] & 0xff) << 8) | ((int32_t)data[pos + 3] & 0xff);
pos += 4;
return ret;
}
uint64_t XDRReader::get_uint64()
{
- uint64_t ret0 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
- | ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
- pos += 4;
- uint64_t ret1 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
- | ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
- pos += 4;
- return (ret0 << 32) | ret1;
+ uint64_t ret = (((uint64_t)data[pos] & 0xffU) << 56) | (((uint64_t)data[pos + 1] & 0xffU) << 48) | (((uint64_t)data[pos + 2] & 0xffU) << 40) | (((uint64_t)data[pos + 3] & 0xffU) << 32) | (((uint64_t)data[pos + 4] & 0xffU) << 24) | (((uint64_t)data[pos + 5] & 0xffU) << 16) | (((uint64_t)data[pos + 6] & 0xffU) << 8) | ((uint64_t)data[pos + 7] & 0xffU);
+ return ret;
}
int64_t XDRReader::get_int64()
{
- int64_t ret0 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
- pos += 4;
- int64_t ret1 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
- pos += 4;
- return (ret0 << 32) | ret1;
+ int64_t ret = (((int64_t)data[pos] & 0xff) << 56) | (((int64_t)data[pos + 1] & 0xff) << 48) | (((int64_t)data[pos + 2] & 0xff) << 40) | (((int64_t)data[pos + 3] & 0xff) << 32) | (((int64_t)data[pos + 4] & 0xff) << 24) | (((int64_t)data[pos + 5] & 0xff) << 16) | (((int64_t)data[pos + 6] & 0xff) << 8) | ((int64_t)data[pos + 7] & 0xff);
+ return ret;
}
float XDRReader::get_float()
@@ -166,22 +164,25 @@ char *XDRReader::get_opaque(uint32_t length)
{
char *ret = data + pos;
pos += length;
- if (length % 4) {
+ if (length % 4)
+ {
pos += 4 - (length % 4);
}
return ret;
}
-void XDRReader::get_string(char* target)
+void XDRReader::get_string(char *target)
{
uint16_t length = get_opaque_length();
uint16_t i;
- for (i = 0; i < length; i++) {
+ for (i = 0; i < length; i++)
+ {
target[i] = data[pos + i];
}
target[i] = 0;
pos += length;
- if (length % 4) {
+ if (length % 4)
+ {
pos += 4 - (length % 4);
}
}
diff --git a/src/lib/xdr16.cc b/src/lib/xdr16.cc
index 2f68463..a9442bb 100644
--- a/src/lib/xdr16.cc
+++ b/src/lib/xdr16.cc
@@ -82,30 +82,38 @@ void XDRWriter::put(double number)
put(v.i);
}
-void XDRWriter::put(char const *data){
- if (!is_fixed_length) {
+void XDRWriter::put(char const *data)
+{
+ if (!is_fixed_length)
+ {
put(next_array_len);
}
uint16_t i;
- for (i = 0; i < next_array_len; i++) {
+ for (i = 0; i < next_array_len; i++)
+ {
*buffer++ = data[i];
}
- while ((i++) % 2 != 0){
+ while ((i++) % 2 != 0)
+ {
*buffer++ = 0;
}
pos += i;
}
-template<uint16_t TSize>
-void XDRWriter::put(char const (&data)[TSize]){
- if (!is_fixed_length) {
+template <uint16_t TSize>
+void XDRWriter::put(char const (&data)[TSize])
+{
+ if (!is_fixed_length)
+ {
put(TSize);
}
uint16_t i;
- for (i = 0; i < TSize; i++) {
+ for (i = 0; i < TSize; i++)
+ {
*buffer++ = data[i];
}
- while ((i++) % 2 != 0){
+ while ((i++) % 2 != 0)
+ {
*buffer++ = 0;
}
pos += i;
@@ -113,51 +121,42 @@ void XDRWriter::put(char const (&data)[TSize]){
uint16_t XDRReader::get_uint16()
{
- uint16_t ret = ((uint8_t)data[pos]<<8) | (uint8_t)data[pos+1];
+ uint16_t ret = (((uint16_t)data[pos] & 0xffU) << 8) | ((uint16_t)data[pos + 1] & 0xffU);
pos += 2;
return ret;
}
int16_t XDRReader::get_int16()
{
- int16_t ret = (data[pos]<<8) | data[pos+1];
+ int16_t ret = (((int16_t)data[pos] & 0xff) << 8) | ((int16_t)data[pos + 1] & 0xff);
pos += 2;
return ret;
}
uint32_t XDRReader::get_uint32()
{
- uint32_t ret = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
- | ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
+ uint32_t ret = (((uint32_t)data[pos] & 0xffU) << 24) | (((uint32_t)data[pos + 1] & 0xffU) << 16) | (((uint32_t)data[pos + 2] & 0xffU) << 8) | ((uint32_t)data[pos + 3] & 0xffU);
pos += 4;
return ret;
}
int32_t XDRReader::get_int32()
{
- int32_t ret = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
+ int32_t ret = (((int32_t)data[pos] & 0xff) << 24) | (((int32_t)data[pos + 1] & 0xff) << 16) | (((int32_t)data[pos + 2] & 0xff) << 8) | ((int32_t)data[pos + 3] & 0xff);
pos += 4;
return ret;
}
uint64_t XDRReader::get_uint64()
{
- uint64_t ret0 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
- | ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
- pos += 4;
- uint64_t ret1 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
- | ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
- pos += 4;
- return (ret0 << 32) | ret1;
+ uint64_t ret = (((uint64_t)data[pos] & 0xffU) << 56) | (((uint64_t)data[pos + 1] & 0xffU) << 48) | (((uint64_t)data[pos + 2] & 0xffU) << 40) | (((uint64_t)data[pos + 3] & 0xffU) << 32) | (((uint64_t)data[pos + 4] & 0xffU) << 24) | (((uint64_t)data[pos + 5] & 0xffU) << 16) | (((uint64_t)data[pos + 6] & 0xffU) << 8) | ((uint64_t)data[pos + 7] & 0xffU);
+ return ret;
}
int64_t XDRReader::get_int64()
{
- int64_t ret0 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
- pos += 4;
- int64_t ret1 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
- pos += 4;
- return (ret0 << 32) | ret1;
+ int64_t ret = (((int64_t)data[pos] & 0xff) << 56) | (((int64_t)data[pos + 1] & 0xff) << 48) | (((int64_t)data[pos + 2] & 0xff) << 40) | (((int64_t)data[pos + 3] & 0xff) << 32) | (((int64_t)data[pos + 4] & 0xff) << 24) | (((int64_t)data[pos + 5] & 0xff) << 16) | (((int64_t)data[pos + 6] & 0xff) << 8) | ((int64_t)data[pos + 7] & 0xff);
+ return ret;
}
float XDRReader::get_float()
@@ -193,22 +192,25 @@ char *XDRReader::get_opaque(uint32_t length)
{
char *ret = data + pos;
pos += length;
- if (length % 2) {
+ if (length % 2)
+ {
pos += 2 - (length % 2);
}
return ret;
}
-void XDRReader::get_string(char* target)
+void XDRReader::get_string(char *target)
{
uint16_t length = get_opaque_length();
uint16_t i;
- for (i = 0; i < length; i++) {
+ for (i = 0; i < length; i++)
+ {
target[i] = data[pos + i];
}
target[i] = 0;
pos += length;
- if (length % 2) {
+ if (length % 2)
+ {
pos += 2 - (length % 2);
}
}