From 15e6f2c9d099fac8307a8e40055886e2f11de1d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C3=ABl=20Carr=C3=A9?= <funman@videolan.org> Date: Sun, 1 Jun 2008 14:30:27 +0200 Subject: [PATCH] Binary updates: support arbitrarily long descriptions Note that an upper limit should be set anyway --- src/misc/update.c | 59 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/misc/update.c b/src/misc/update.c index dc6ec48333a8..5e555e2a30c7 100644 --- a/src/misc/update.c +++ b/src/misc/update.c @@ -67,7 +67,7 @@ * * e is an OPTIONAL extra letter * * AKA "0.8.6d" or "0.9.0" * Second line is an url of the binary for this last version - * Third line is a description of the update (it MAY be extended to several lines, but for now it is only one line) + * Remaining text is a required description of the update */ #if defined( UNDER_CE ) @@ -1104,7 +1104,6 @@ static bool GetUpdateFile( update_t *p_update ) int i_minor = 0; int i_revision = 0; unsigned char extra; - char *psz_line = NULL; char *psz_version_line = NULL; p_stream = stream_UrlNew( p_update->p_libvlc, UPDATE_VLC_STATUS_URL ); @@ -1115,18 +1114,18 @@ static bool GetUpdateFile( update_t *p_update ) goto error; } - /* Try to read three lines */ - if( !( psz_line = stream_ReadLine( p_stream ) ) ) + /* Start reading the status file */ + if( !( psz_version_line = stream_ReadLine( p_stream ) ) ) { msg_Err( p_update->p_libvlc, "Update file %s is corrupted : missing version", UPDATE_VLC_STATUS_URL ); goto error; } - psz_version_line = psz_line; /* first line : version number */ p_update->release.extra = 0; - switch( sscanf( psz_line, "%i.%i.%i%c", &i_major, &i_minor, &i_revision, &extra ) ) + switch( sscanf( psz_version_line, "%i.%i.%i%c", + &i_major, &i_minor, &i_revision, &extra ) ) { case 4: p_update->release.extra = extra; @@ -1140,24 +1139,35 @@ static bool GetUpdateFile( update_t *p_update ) goto error; } - /* Second line : URL */ - if( !( psz_line = stream_ReadLine( p_stream ) ) ) + /* second line : URL */ + if( !( p_update->release.psz_url = stream_ReadLine( p_stream ) ) ) { msg_Err( p_update->p_libvlc, "Update file %s is corrupted : URL missing", UPDATE_VLC_STATUS_URL ); goto error; } - p_update->release.psz_url = psz_line; + /* Remaining data : description */ + int i_read = stream_Size( p_stream ) - stream_Tell( p_stream ); + if( i_read <= 0 ) + { + msg_Err( p_update->p_libvlc, + "Update file %s is corrupted: description missing", + UPDATE_VLC_STATUS_URL ); + goto error; + } - /* Third line : description */ - if( !( psz_line = stream_ReadLine( p_stream ) ) ) + p_update->release.psz_desc = (char*) malloc( i_read + 1 ); + if( !p_update->release.psz_desc ) + goto error; + + if( stream_Read( p_stream, p_update->release.psz_desc, i_read ) != i_read ) { - msg_Err( p_update->p_libvlc, "Update file %s is corrupted : description missing", - UPDATE_VLC_STATUS_URL ); + msg_Err( p_update->p_libvlc, "Couldn't download update file %s", + UPDATE_VLC_STATUS_URL ); goto error; } - p_update->release.psz_desc = psz_line; + p_update->release.psz_desc[i_read] = '\0'; stream_Delete( p_stream ); p_stream = NULL; @@ -1244,12 +1254,23 @@ static bool GetUpdateFile( update_t *p_update ) if( sign.type == TEXT_SIGNATURE ) gcry_md_putc( hd, '\r' ); gcry_md_putc( hd, '\n' ); - gcry_md_write( hd, p_update->release.psz_desc, - strlen( p_update->release.psz_desc ) ); - if( sign.type == TEXT_SIGNATURE ) - gcry_md_putc( hd, '\r' ); - gcry_md_putc( hd, '\n' ); + char *psz_desc = p_update->release.psz_desc; + while( *psz_desc ) + { + size_t i_len = strcspn( psz_desc, "\r\n" ); + if( !i_len ) + break; + + gcry_md_write( hd, psz_desc, i_len ); + if( sign.type == TEXT_SIGNATURE ) + gcry_md_putc( hd, '\r' ); + gcry_md_putc( hd, '\n' ); + + psz_desc += i_len; + while( *psz_desc == '\r' || *psz_desc == '\n' ) + psz_desc++; + } if( sign.version == 3 ) { -- GitLab