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>
|
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -52,28 +52,28 @@
|
|||||||
|
|
||||||
static
|
static
|
||||||
udf_file_t *
|
udf_file_t *
|
||||||
list_directory(const udf_t *p_udf, udf_file_t *p_udf_file,
|
list_files(const udf_t *p_udf, udf_file_t *p_udf_file, char *psz_token)
|
||||||
const char *psz_token)
|
|
||||||
{
|
{
|
||||||
if (!p_udf_file) return NULL;
|
if (!p_udf_file) return NULL;
|
||||||
|
if (psz_token) printf("%s\n", psz_token);
|
||||||
while (udf_get_next(p_udf, p_udf_file)) {
|
while (udf_get_next(p_udf, p_udf_file)) {
|
||||||
printf("%s\n", psz_token);
|
char *next_tok = strtok(psz_token, udf_PATH_DELIMITERS);
|
||||||
if (strcmp(psz_token, udf_get_name(p_udf_file)) == 0) {
|
|
||||||
const char *next_tok = strtok(NULL, udf_PATH_DELIMITERS);
|
|
||||||
|
|
||||||
if (udf_is_dir(p_udf_file)) {
|
if (udf_is_dir(p_udf_file)) {
|
||||||
udf_file_t * p_udf_file2 = udf_get_sub(p_udf, p_udf_file);
|
udf_file_t * p_udf_file2 = udf_get_sub(p_udf, p_udf_file);
|
||||||
|
|
||||||
if (p_udf_file2) {
|
if (p_udf_file2) {
|
||||||
udf_file_t *p_udf_file3 =
|
udf_file_t *p_udf_file3 =
|
||||||
list_directory(p_udf, p_udf_file2, next_tok);
|
list_files(p_udf, p_udf_file2, next_tok);
|
||||||
|
|
||||||
if (!p_udf_file3) udf_file_free(p_udf_file2);
|
if (!p_udf_file3) udf_file_free(p_udf_file2);
|
||||||
return p_udf_file3;
|
udf_file_free(p_udf_file3);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
printf("%s\n", udf_get_name(p_udf_file));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(psz_token);
|
||||||
return p_udf_file;
|
return p_udf_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,8 +102,8 @@ main(int argc, const char *argv[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
list_directory(p_udf, p_udf_file, udf_get_name(p_udf_file));
|
list_files(p_udf, p_udf_file, strdup(udf_get_name(p_udf_file)));
|
||||||
/* Go over: udf_file_free(p_udf_file);*/
|
udf_file_free(p_udf_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
udf_close(p_udf);
|
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>
|
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
|
Wonder if iconv can be used here
|
||||||
*/
|
*/
|
||||||
static int
|
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;
|
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 ] == 8 ) || ( data[ 0 ] == 16 ) ) do {
|
||||||
if( data[ 0 ] == 16 ) p++; /* Ignore MSB of unicode16 */
|
if( data[ 0 ] == 16 ) p++; /* Ignore MSB of unicode16 */
|
||||||
if( p < len ) {
|
if( p < len ) {
|
||||||
target[ i++ ] = data[ p++ ];
|
(*ppsz_target)[ i++ ] = data[ p++ ];
|
||||||
}
|
}
|
||||||
} while( p < len );
|
} while( p < len );
|
||||||
|
|
||||||
target[ i ] = '\0';
|
(*ppsz_target)[ i ] = '\0';
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -493,7 +496,7 @@ udf_close (udf_t *p_udf)
|
|||||||
udf_file_t *
|
udf_file_t *
|
||||||
udf_get_sub(const udf_t *p_udf, const udf_file_t *p_udf_file)
|
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];
|
uint8_t data[UDF_BLOCKSIZE];
|
||||||
udf_file_entry_t *p_fe = (udf_file_entry_t *) &data;
|
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->b_parent =
|
||||||
(p_udf_file->fid->file_characteristics & UDF_FILE_PARENT) != 0;
|
(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,
|
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 p_udf_file;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user