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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user