[Vortex] wrong int to ptr conversion in case of 64 bit

Szilard Pfeiffer szilard.pfeiffer at gmail.com
Wed Nov 19 13:30:04 CET 2008


There is macro to convert integers to pointer value in libaxl 
(src/axl_config.h):

#define INT_TO_PTR(integer)   ((axlPointer) (long) ((int)integer))

In case of amd64 architecture both the size of long and void * are 64 
bits, but the size of int is 32 bits, so the macro above truncates the 
higher 32 bits of the ineteger value.

Here is a test case:

#include <axl.h>

#include <stdio.h>

int
main()
{
  printf("%ld %ld %ld\n", sizeof(int), sizeof(long), sizeof(void *));

  long l = 0x8765432112345678L;
  void *p = INT_TO_PTR(l);

  printf("0x%lx %p\n", l, p);

  void *p0 = &l;
  void *p1 = INT_TO_PTR(PTR_TO_INT(p0));

  printf("%p %p\n", p0, p1);
  return 0;
}

Possible solution:

--- configure.ac    (revision 3658)
+++ configure.ac    (working copy)
@@ -126,7 +126,7 @@
  *
  * @return A \ref axlPointer reference.
  */
-#define INT_TO_PTR(integer)   ((axlPointer) ${pti_cast} ((int)integer))
+#define INT_TO_PTR(integer)   ((axlPointer) ${pti_cast} (integer))
 
 /**
  * @brief Allows to convert a pointer reference (\ref axlPointer),


Patch above workarounds the following problem (which cause segmentation 
fault in amd64 architecture) in libvortex:

--- src/vortex_connection.c    (revision 3658)
+++ src/vortex_connection.c    (working copy)
@@ -3057,7 +3057,7 @@
 
     /* channel 0 always exists, and cannot be closed. It's closed
      * when connection (or session) is closed */
-    channel = vortex_hash_lookup (INT_TO_PTR (connection->channels), 
INT_TO_PTR(channel_num));
+    channel = vortex_hash_lookup (connection->channels, 
INT_TO_PTR(channel_num));
    
     if (channel == NULL)
         vortex_log (LOG_DOMAIN, VORTEX_LEVEL_DEBUG, "failed to get 
channel=%d", channel_num);



More information about the Vortex mailing list