]> git.sur5r.net Git - openldap/blobdiff - libraries/liblber/decode.c
Belongs in the include directory
[openldap] / libraries / liblber / decode.c
index a722c9eb7a319a12ad027c85310c1d9c6264ccb4..2fd2a6252ba996319a5cecc57683e5c65b134b87 100644 (file)
 #include <stdarg.h>
 #include "macos.h"
 #else /* MACOS */
-#if defined(NeXT) || defined(VMS)
+
+#if defined(NeXT) || defined(VMS) || defined(__FreeBSD__)
 #include <stdlib.h>
-#else /* next || vms */
+#else /* next || vms || freebsd */
 #include <malloc.h>
-#endif /* next || vms */
+#endif /* next || vms || freebsd */
 #if defined(BC31) || defined(_WIN32)
 #include <stdarg.h>
 #else /* BC31 || _WIN32 */
@@ -155,6 +156,7 @@ ber_getnint( BerElement *ber, long *num, int len )
 {
        int     diff, sign, i;
        long    netnum;
+       char    *p;
 
        /*
         * The tag and length have already been stripped off.  We should
@@ -172,11 +174,12 @@ ber_getnint( BerElement *ber, long *num, int len )
        if ( ber_read( ber, ((char *) &netnum) + diff, len ) != len )
                return( -1 );
 
-       /* sign extend if necessary */
-       sign = ((0x80 << ((len - 1) * 8)) & netnum);
-       if ( sign && len < sizeof(long) ) {
-               for ( i = sizeof(long) - 1; i > len - 1; i-- ) {
-                       netnum |= (0xffL << (i * 8));
+        /* sign extend if necessary */
+        p = (char *) &netnum;
+        sign = (0x80 & *(p+diff) );
+        if ( sign && len < sizeof(long) ) {
+                for ( i = 0; i < diff; i++ ) {
+                        *(p+i) = 0xff;
                }
        }
        *num = LBER_NTOHL( netnum );