Remove memory leak and invalid write references thanks to valgrind.

Now lists all files correctly - at least in the absense of directories
under /.
This commit is contained in:
rocky
2005-10-25 01:19:48 +00:00
parent 723c5d5dae
commit fd0bbfbab1
2 changed files with 26 additions and 23 deletions

View File

@@ -1,5 +1,5 @@
/*
$Id: udf1.c,v 1.2 2005/10/24 10:14:57 rocky Exp $
$Id: udf1.c,v 1.3 2005/10/25 01:19:48 rocky Exp $
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
@@ -52,28 +52,28 @@
static
udf_file_t *
list_directory(const udf_t *p_udf, udf_file_t *p_udf_file,
const char *psz_token)
list_files(const udf_t *p_udf, udf_file_t *p_udf_file, char *psz_token)
{
if (!p_udf_file) return NULL;
if (psz_token) printf("%s\n", psz_token);
while (udf_get_next(p_udf, p_udf_file)) {
printf("%s\n", psz_token);
if (strcmp(psz_token, udf_get_name(p_udf_file)) == 0) {
const char *next_tok = strtok(NULL, udf_PATH_DELIMITERS);
char *next_tok = strtok(psz_token, udf_PATH_DELIMITERS);
if (udf_is_dir(p_udf_file)) {
udf_file_t * p_udf_file2 = udf_get_sub(p_udf, p_udf_file);
if (udf_is_dir(p_udf_file)) {
udf_file_t * p_udf_file2 = udf_get_sub(p_udf, p_udf_file);
if (p_udf_file2) {
udf_file_t *p_udf_file3 =
list_directory(p_udf, p_udf_file2, next_tok);
if (p_udf_file2) {
udf_file_t *p_udf_file3 =
list_files(p_udf, p_udf_file2, next_tok);
if (!p_udf_file3) udf_file_free(p_udf_file2);
return p_udf_file3;
}
if (!p_udf_file3) udf_file_free(p_udf_file2);
udf_file_free(p_udf_file3);
}
} else {
printf("%s\n", udf_get_name(p_udf_file));
}
}
free(psz_token);
return p_udf_file;
}
@@ -102,8 +102,8 @@ main(int argc, const char *argv[])
return 1;
}
list_directory(p_udf, p_udf_file, udf_get_name(p_udf_file));
/* Go over: udf_file_free(p_udf_file);*/
list_files(p_udf, p_udf_file, strdup(udf_get_name(p_udf_file)));
udf_file_free(p_udf_file);
}
udf_close(p_udf);

View File

@@ -1,5 +1,5 @@
/*
$Id: udf_fs.c,v 1.3 2005/10/24 10:14:58 rocky Exp $
$Id: udf_fs.c,v 1.4 2005/10/25 01:19:48 rocky Exp $
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
@@ -251,18 +251,21 @@ udf_find_file(udf_t *p_udf, const char *psz_name, bool b_any_partition,
Wonder if iconv can be used here
*/
static int
unicode16_decode( uint8_t *data, int len, char *target )
unicode16_decode( uint8_t *data, int len, char **ppsz_target )
{
int p = 1, i = 0;
if (strlen(*ppsz_target) < len)
*ppsz_target = realloc(*ppsz_target, sizeof(char)*len+1);
if( ( data[ 0 ] == 8 ) || ( data[ 0 ] == 16 ) ) do {
if( data[ 0 ] == 16 ) p++; /* Ignore MSB of unicode16 */
if( p < len ) {
target[ i++ ] = data[ p++ ];
(*ppsz_target)[ i++ ] = data[ p++ ];
}
} while( p < len );
target[ i ] = '\0';
(*ppsz_target)[ i ] = '\0';
return 0;
}
@@ -493,7 +496,7 @@ udf_close (udf_t *p_udf)
udf_file_t *
udf_get_sub(const udf_t *p_udf, const udf_file_t *p_udf_file)
{
if (p_udf_file->b_dir && p_udf_file->fid) {
if (p_udf_file->b_dir && !p_udf_file->b_parent && p_udf_file->fid) {
uint8_t data[UDF_BLOCKSIZE];
udf_file_entry_t *p_fe = (udf_file_entry_t *) &data;
@@ -561,7 +564,7 @@ udf_get_next(const udf_t *p_udf, udf_file_t *p_udf_file)
p_udf_file->b_parent =
(p_udf_file->fid->file_characteristics & UDF_FILE_PARENT) != 0;
unicode16_decode(p_udf_file->fid->imp_use + p_udf_file->fid->i_imp_use,
p_udf_file->fid->i_file_id, p_udf_file->psz_name);
p_udf_file->fid->i_file_id, &(p_udf_file->psz_name));
return p_udf_file;
}
return NULL;