title: memcpy segmentation fault. Misalignment of data structure boundaries
body: <p>I am trying to debug this error but have not been able to do it for a while now. I have tried to use memmove as an alternative but that also results in a segmentation fault. 
  The link to the code in this question is posted at - <a href="http://pastebin.com/hiwV5G04" rel="nofollow">http://pastebin.com/hiwV5G04</a></p>
  
  <p>Can someone please help me understand what am I doing wrong ?</p>
  
  <pre><code>//------------------------------------------------------------------------
  // Somewhere in the main function, This is the piece of code I am executing
  //------------------------------------------------------------------------
  SslDecryptSession *ssl_session = malloc(sizeof(struct _SslDecryptSession ));
  ssl_session-&gt;client_random.data = NULL;  //Make the stuff point somewhere. Else can use malloc also here. Not sure if this is a problem
  ssl_session-&gt;server_random.data= NULL;
  const u_char *payload;                  /* Packet payload */
  //Case for client random
  printf("Client Random ");
  for (cs_id = 11; cs_id &lt; 43; cs_id++){
  printf("%hhX", payload[cs_id] );
  }
  printf("\n");
  cs_id=11;
  ssl_session-&gt;client_random.data_len=32;
  // Segmentation fault here
  memcpy(ssl_session-&gt;client_random.data, payload[cs_id], 32);
  </code></pre>
  
  <p>The definitions of the structures involved are - </p>
  
  <pre><code>typedef struct _SslDecryptSession {
  guchar _master_secret[SSL_MASTER_SECRET_LENGTH];
  guchar _session_id[256];
  guchar _client_random[32];
  guchar _server_random[32];
  StringInfo session_id;
  StringInfo session_ticket;
  StringInfo server_random;
  StringInfo client_random;
  StringInfo master_secret;
  StringInfo handshake_data;
  StringInfo pre_master_secret;
  guchar _server_data_for_iv[24];
  StringInfo server_data_for_iv;
  guchar _client_data_for_iv[24];
  StringInfo client_data_for_iv;
  
  gint state;
  SslCipherSuite cipher_suite;
  SslDecoder *server;
  SslDecoder *client;
  SslDecoder *server_new;
  SslDecoder *client_new;
  gcry_sexp_t private_key;
  StringInfo psk;
  guint16 version_netorder;
   StringInfo app_data_segment;
      SslSession session;
  } SslDecryptSession;
  
  
  typedef struct _StringInfo {
      guchar  *data;         
      guint    data_len;  
     } StringInfo
  </code></pre>
  
  <p>The output from gdb is this </p>
  
  <pre><code>b 1985    // Putting a break point at line 1985 in my source code. 
  //Here this is eqvialent to line 83, that is "ssl_session-&gt;client_random.data_len=32;"
  Breakpoint 1 at 0x403878: file Newversion.c, line 1985.
  run       //run the code in gdb
  At breakpoint 1 the following info is in the variables
  p ssl_session
  $1 = (SslDecryptSession *) 0x60fc50   // I put some data in ssl_session-&gt;version_netorder earlier. So it is not null here. Everything works fine here
  p ssl_session-&gt;client_random.data
  $2 = (guchar *) 0x0
  p ssl_session-&gt;client_random.data_len
  $3 = 32
  step  // Execute 1 more line in the code
  // I reach at the memcpy line and I get this error then
  Breakpoint 1, got_packet (args=0x0, header=0x7fffffffe2c0, packet=0x7ffff6939086 "P=\345\203\376\177") at Newversion.c:1995
  1995                memcpy(ssl_session-&gt;client_random.data, payload[cs_id], 32);
  (gdb) 
  (gdb) s
  __memcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:27
  27  ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S: No such file or directory.
  (gdb) 
  28  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  29  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  30  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  31  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  32  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  33  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  34  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  35  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  (gdb) 
  
  Program received signal SIGSEGV, Segmentation fault.
  __memcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:35
  35  in ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
  </code></pre>