[vlc-commits] update: factorize using macro

Rafaël Carré git at videolan.org
Wed Jun 15 23:13:04 CEST 2011


vlc | branch: master | Rafaël Carré <rafael.carre at gmail.com> | Wed Jun 15 17:11:57 2011 -0400| [53ef9d24ee9d2ec8556a20c84e168275a252c7d7] | committer: Rafaël Carré

update: factorize using macro

also fix a memleak in an error path

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=53ef9d24ee9d2ec8556a20c84e168275a252c7d7
---

 src/misc/update_crypto.c |  101 ++++++++++++----------------------------------
 1 files changed, 26 insertions(+), 75 deletions(-)

diff --git a/src/misc/update_crypto.c b/src/misc/update_crypto.c
index 5bcea77..55e7f39 100644
--- a/src/misc/update_crypto.c
+++ b/src/misc/update_crypto.c
@@ -73,6 +73,16 @@ static inline int scalar_number( uint8_t *p, int header_len )
 /* number of data bytes in a MPI */
 #define mpi_len( mpi ) ( ( scalar_number( mpi, 2 ) + 7 ) / 8 )
 
+#define READ_MPI(n, bits) do { \
+    if( i_read + 2 > i_packet_len ) \
+        goto error; \
+    int len = mpi_len( p_buf ); \
+    if( len > (bits)/8 || i_read + 2 + len > i_packet_len ) \
+        goto error; \
+    len += 2; \
+    memcpy( n, p_buf, len ); \
+    p_buf += len; i_read += len; \
+    } while(0)
 
 /*
  * fill a public_key_packet_t structure from public key packet data
@@ -98,59 +108,18 @@ static int parse_public_key_packet( public_key_packet_t *p_key, uint8_t *p_buf,
     if( p_key->algo != PUBLIC_KEY_ALGO_DSA )
         return VLC_EGENERIC;
 
-    /* read p */
-    if( i_read + 2 > i_packet_len )
-        return VLC_EGENERIC;
-
-    int i_p_len = mpi_len( p_buf );
-
-    if( i_p_len > 128 || i_read + 2 + i_p_len > i_packet_len )
-        return VLC_EGENERIC;
-
-    memcpy( p_key->p, p_buf, 2+i_p_len );
-    p_buf += 2+i_p_len; i_read += 2+i_p_len;
-
-    /* read q */
-    if( i_read + 2 > i_packet_len )
-        return VLC_EGENERIC;
-
-    int i_q_len = mpi_len( p_buf );
-
-    if( i_q_len > 20 || i_read+2+i_q_len > i_packet_len )
-        return VLC_EGENERIC;
-
-    memcpy( p_key->q, p_buf, 2+i_q_len );
-    p_buf += 2+i_q_len; i_read += 2+i_q_len;
-
-    /* read g */
-    if( i_read + 2 > i_packet_len )
-        return VLC_EGENERIC;
-
-    int i_g_len = mpi_len( p_buf );
-
-    if( i_g_len > 128 || i_read+2+i_g_len > i_packet_len )
-        return VLC_EGENERIC;
-
-    memcpy( p_key->g, p_buf, 2+i_g_len );
-    p_buf += 2+i_g_len; i_read += 2+i_g_len;
-
-    /* read y */
-    if( i_read + 2 > i_packet_len )
-        return VLC_EGENERIC;
-
-    int i_y_len = mpi_len( p_buf );
-
-
-    if( i_y_len > 128 || i_read+2+i_y_len > i_packet_len )
-        return VLC_EGENERIC;
-
-    memcpy( p_key->y, p_buf, 2+i_y_len );
-    i_read += 2+i_y_len;
+    READ_MPI(p_key->p, 1024);
+    READ_MPI(p_key->q, 160);
+    READ_MPI(p_key->g, 1024);
+    READ_MPI(p_key->y, 1024);
 
     if( i_read != i_packet_len ) /* some extra data eh ? */
         return VLC_EGENERIC;
 
     return VLC_SUCCESS;
+
+error:
+    return VLC_EGENERIC;
 }
 
 
@@ -288,9 +257,9 @@ static size_t parse_signature_v4_packet( signature_packet_t *p_sig,
 
 
 static int parse_signature_packet( signature_packet_t *p_sig,
-                                   uint8_t *p_buf, size_t i_sig_len )
+                                   uint8_t *p_buf, size_t i_packet_len )
 {
-    if( !i_sig_len ) /* 1st sanity check, we need at least the version */
+    if( !i_packet_len ) /* 1st sanity check, we need at least the version */
         return VLC_EGENERIC;
 
     p_sig->version = *p_buf++;
@@ -299,12 +268,12 @@ static int parse_signature_packet( signature_packet_t *p_sig,
     switch( p_sig->version )
     {
         case 3:
-            i_read = parse_signature_v3_packet( p_sig, p_buf, i_sig_len );
+            i_read = parse_signature_v3_packet( p_sig, p_buf, i_packet_len );
             break;
         case 4:
             p_sig->specific.v4.hashed_data = NULL;
             p_sig->specific.v4.unhashed_data = NULL;
-            i_read = parse_signature_v4_packet( p_sig, p_buf, i_sig_len );
+            i_read = parse_signature_v4_packet( p_sig, p_buf, i_packet_len );
             break;
         default:
             return VLC_EGENERIC;
@@ -335,30 +304,11 @@ static int parse_signature_packet( signature_packet_t *p_sig,
     p_buf--; /* rewind to the version byte */
     p_buf += i_read;
 
-    if( i_read + 2 > i_sig_len )
-        goto error;
-
-    size_t i_r_len = mpi_len( p_buf ); i_read += 2;
-    if( i_read + i_r_len > i_sig_len || i_r_len > 20 )
-        goto error;
-
-    memcpy( p_sig->r, p_buf, 2 + i_r_len );
-    p_buf += 2 + i_r_len;
-    i_read += i_r_len;
-
-    if( i_read + 2 > i_sig_len )
-        goto error;
-
-    size_t i_s_len = mpi_len( p_buf ); i_read += 2;
-    if( i_read + i_s_len > i_sig_len || i_s_len > 20 )
-        goto error;
-
-    memcpy( p_sig->s, p_buf, 2 + i_s_len );
-    p_buf += 2 + i_s_len;
-    i_read += i_s_len;
+    READ_MPI(p_sig->r, 160);
+    READ_MPI(p_sig->s, 160);
 
-    assert( i_read == i_sig_len );
-    if( i_read < i_sig_len ) /* some extra data, hm ? */
+    assert( i_read == i_packet_len );
+    if( i_read < i_packet_len ) /* some extra data, hm ? */
         goto error;
 
     return VLC_SUCCESS;
@@ -834,6 +784,7 @@ uint8_t *hash_sha1_from_public_key( public_key_t *p_pkey )
         p_hash[0] != p_pkey->sig.hash_verification[0] ||
         p_hash[1] != p_pkey->sig.hash_verification[1] )
     {
+        free(p_hash);
         return NULL;
     }
 



More information about the vlc-commits mailing list