Sun compat
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index e7478a0..039a973 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -56,6 +56,15 @@
 };
 
 
+/*
+ * Endianness check. Will be optimized out by the compiler.
+ */
+static int
+little_endian() {
+    int le_check = 1;
+    return *(char *)&le_check;
+}
+
 int
 OBJECT_IDENTIFIER_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
 		asn_app_constraint_failed_f *ctfailcb, void *app_key) {
@@ -81,7 +90,6 @@
 
 int
 OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbufp, unsigned int rvsize) {
-	unsigned LE CC_NOTUSED = 1; /* Little endian (x86) */
 	const uint8_t *arcend = arcbuf + arclen;	/* End of arc */
 	unsigned int cache = 0;	/* No more than 14 significant bits */
 	unsigned char *rvbuf = (unsigned char *)rvbufp;
@@ -126,15 +134,15 @@
 			arcbuf++;
 		}
 	}
-
 	/* Faster path for common size */
-	if(rvsize == (CHAR_BIT * sizeof(unsigned long))) {
+	if(rvsize == (CHAR_BIT * sizeof(unsigned long))
+        && (arcend-arcbuf) <= (ssize_t)sizeof(unsigned long)) {
 		unsigned long accum;
 		/* Gather all bits into the accumulator */
 		for(accum = cache; arcbuf < arcend; arcbuf++)
 			accum = (accum << 7) | (*arcbuf & ~0x80);
 		if(accum < (unsigned)-add
-		|| accum > (ULONG_MAX-(unsigned long)(-add))) {
+		|| accum > ULONG_MAX-(unsigned long)(-add)) {
 			errno = ERANGE;	/* Overflow */
 			return -1;
 		}
@@ -143,15 +151,14 @@
 		return 0;
 	}
 
-#ifndef	WORDS_BIGENDIAN
-	if(*(unsigned char *)&LE) {	/* Little endian (x86) */
+	if(little_endian()) {	/* Little endian (x86) */
 		/* "Convert" to big endian */
 		rvbuf += rvsize / CHAR_BIT - 1;
 		rvstart--;
 		inc = -1;	/* Descending */
-	} else
-#endif	/* !WORDS_BIGENDIAN */
-		inc = +1;	/* Big endian is known [at compile time] */
+	} else {
+		inc = +1;	/* Big endian */
+        }
 
 	{
 		int bits;	/* typically no more than 3-4 bits */
@@ -401,7 +408,6 @@
 			/*
 			 * First two arcs are encoded through the backdoor.
 			 */
-			unsigned LE = 1;	/* Little endian */
 			int first_arc;
 			num_arcs++;
 			if(!arc_slots) { num_arcs++; continue; }
@@ -414,7 +420,7 @@
 			add = -40 * first_arc;
 			memset(arcs, 0, arc_type_size);
 			*(unsigned char *)((char *)arcs
-				+ ((*(char *)&LE)?0:(arc_type_size - 1)))
+				+ (little_endian()?0:(arc_type_size - 1)))
 					= first_arc;
 			arcs = ((char *)arcs) + arc_type_size;
 		}
@@ -423,8 +429,9 @@
 		if(arcs < arcs_end) {
 			if(OBJECT_IDENTIFIER_get_single_arc(&oid->buf[startn],
 				i - startn + 1, add,
-					arcs, arc_type_size))
+					arcs, arc_type_size)) {
 				return -1;
+                        }
 			startn = i + 1;
 			arcs = ((char *)arcs) + arc_type_size;
 			add = 0;
@@ -448,19 +455,13 @@
 	 * assert(arcval_size <= 16);
 	 * assert(arcbuf);
 	 */
-#ifdef	WORDS_BIGENDIAN
-	const unsigned isLittleEndian = 0;
-#else
-	unsigned LE = 1;
-	unsigned isLittleEndian = *(char *)&LE;
-#endif
 	const uint8_t *tend, *tp;
 	unsigned int cache;
 	uint8_t *bp = arcbuf;
 	int bits;
 	uint8_t buffer[16];
 
-	if(isLittleEndian && !prepared_order) {
+	if(little_endian() && !prepared_order) {
 		const uint8_t *a = (const unsigned char *)arcval + arcval_size - 1;
 		const uint8_t *aend = (const uint8_t *)arcval;
 		uint8_t *msb = buffer + arcval_size - 1;
@@ -511,8 +512,6 @@
 OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid, const void *arcs, unsigned int arc_type_size, unsigned int arc_slots) {
 	uint8_t *buf;
 	uint8_t *bp;
-	unsigned LE = 1;	/* Little endian (x86) */
-	unsigned isLittleEndian = *((char *)&LE);
 	unsigned int arc0;
 	unsigned int arc1;
 	unsigned size;
@@ -540,7 +539,7 @@
 		break;
 	default:
 		arc1 = arc0 = 0;
-		if(isLittleEndian) {	/* Little endian (x86) */
+		if(little_endian()) {	/* Little endian (x86) */
 			const unsigned char *ps, *pe;
 			/* If more significant bytes are present,
 			 * make them > 255 quick */
@@ -613,7 +612,7 @@
 		/* Copy the second (1'st) arcs[1] into the first_value */
 		*fv++ = 0;
 		arcs = ((const char *)arcs) + arc_type_size;
-		if(isLittleEndian) {
+		if(little_endian()) {
 			const uint8_t *aend = (const unsigned char *)arcs - 1;
 			const uint8_t *a1 = (const unsigned char *)arcs + arc_type_size - 1;
 			for(; a1 > aend; fv++, a1--) *fv = *a1;