Prevented that non-MD5 nodes from old image get an MD5 in appended session.
This commit is contained in:
parent
fd124c82d2
commit
ecf2ca044e
@ -896,20 +896,24 @@ int checksum_prepare_image(IsoImage *src, int flag)
|
|||||||
@flag bit0= recursion
|
@flag bit0= recursion
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
int checksum_prepare_nodes(IsoImage *img, IsoNode *node, int flag)
|
int checksum_prepare_nodes(Ecma119Image *target, IsoNode *node, int flag)
|
||||||
{
|
{
|
||||||
IsoNode *pos;
|
IsoNode *pos;
|
||||||
IsoFile *file;
|
IsoFile *file;
|
||||||
int ret, i;
|
IsoImage *img;
|
||||||
|
int ret, i, no_md5 = 0;
|
||||||
size_t value_length;
|
size_t value_length;
|
||||||
unsigned int idx = 0;
|
unsigned int idx = 0;
|
||||||
char *value;
|
char *value;
|
||||||
void *xipt = NULL;
|
void *xipt = NULL;
|
||||||
|
|
||||||
|
img= target->image;
|
||||||
|
|
||||||
if (node->type == LIBISO_FILE) {
|
if (node->type == LIBISO_FILE) {
|
||||||
file = (IsoFile *) node;
|
file = (IsoFile *) node;
|
||||||
if (file->from_old_session) {
|
if (file->from_old_session && target->appendable) {
|
||||||
/* Save eventual MD5 data of files from old image */
|
/* Save MD5 data of files from old image which will not
|
||||||
|
be copied and have an MD5 recorded in the old image. */
|
||||||
value= NULL;
|
value= NULL;
|
||||||
ret = iso_node_lookup_attr(node, "isofs.cx", &value_length,
|
ret = iso_node_lookup_attr(node, "isofs.cx", &value_length,
|
||||||
&value, 0);
|
&value, 0);
|
||||||
@ -924,18 +928,25 @@ int checksum_prepare_nodes(IsoImage *img, IsoNode *node, int flag)
|
|||||||
xipt);
|
xipt);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
} else
|
||||||
|
no_md5 = 1;
|
||||||
|
} else {
|
||||||
|
no_md5 = 1;
|
||||||
}
|
}
|
||||||
if (value != NULL)
|
if (value != NULL)
|
||||||
free(value);
|
free(value);
|
||||||
}
|
}
|
||||||
/* Equip all nodes with provisory isofs.cx numbers: 4 byte, all 0. */
|
/* Equip nodes with provisory isofs.cx numbers: 4 byte, all 0.
|
||||||
|
Omit those from old image which will not be copied and have no MD5.
|
||||||
|
*/
|
||||||
|
if (!no_md5) {
|
||||||
ret = iso_file_set_isofscx(file, (unsigned int) 0, 0);
|
ret = iso_file_set_isofscx(file, (unsigned int) 0, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
} else if (node->type == LIBISO_DIR) {
|
} else if (node->type == LIBISO_DIR) {
|
||||||
for (pos = ((IsoDir *) node)->children; pos != NULL; pos = pos->next) {
|
for (pos = ((IsoDir *) node)->children; pos != NULL; pos = pos->next) {
|
||||||
ret = checksum_prepare_nodes(img, pos, 1);
|
ret = checksum_prepare_nodes(target, pos, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1081,7 +1092,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (target->appendable) {
|
if (target->appendable) {
|
||||||
ret = checksum_prepare_nodes(src, (IsoNode *) src->root, 0);
|
ret = checksum_prepare_nodes(target, (IsoNode *) src->root, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,8 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
ino_t ino_id;
|
ino_t ino_id;
|
||||||
|
|
||||||
#ifdef Libisofs_with_checksumS
|
#ifdef Libisofs_with_checksumS
|
||||||
int cret;
|
int cret, no_md5= 0;
|
||||||
|
void *xipt = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (img == NULL || file == NULL || src == NULL) {
|
if (img == NULL || file == NULL || src == NULL) {
|
||||||
@ -99,7 +100,7 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
|
|
||||||
#ifdef Libisofs_with_checksumS
|
#ifdef Libisofs_with_checksumS
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0 && (*src)->checksum_index > 0) {
|
||||||
/* Duplicate file source was mapped to previously registered source
|
/* Duplicate file source was mapped to previously registered source
|
||||||
*/
|
*/
|
||||||
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
|
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
|
||||||
@ -117,7 +118,14 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
|
|
||||||
#ifdef Libisofs_with_checksumS
|
#ifdef Libisofs_with_checksumS
|
||||||
|
|
||||||
if(img->md5_file_checksums) {
|
if (img->md5_file_checksums && file->from_old_session && img->appendable) {
|
||||||
|
/* Omit MD5 indexing with old image nodes which have no MD5 */
|
||||||
|
ret = iso_node_get_xinfo((IsoNode *) file, checksum_xinfo_func, &xipt);
|
||||||
|
if (ret <= 0)
|
||||||
|
no_md5 = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (img->md5_file_checksums && !no_md5) {
|
||||||
img->checksum_idx_counter++;
|
img->checksum_idx_counter++;
|
||||||
if (img->checksum_idx_counter < 0x80000000) {
|
if (img->checksum_idx_counter < 0x80000000) {
|
||||||
fsrc->checksum_index= img->checksum_idx_counter;
|
fsrc->checksum_index= img->checksum_idx_counter;
|
||||||
|
@ -5033,7 +5033,8 @@ int iso_image_get_session_md5(IsoImage *image, uint32_t *start_lba,
|
|||||||
* @param md5
|
* @param md5
|
||||||
* Eventually returns 16 byte of MD5 checksum
|
* Eventually returns 16 byte of MD5 checksum
|
||||||
* @param flag
|
* @param flag
|
||||||
* Bitfield for control purposes, unused yet, submit 0
|
* Bitfield for control purposes
|
||||||
|
* bit0= only determine return value, do not touch parameter md5
|
||||||
* @return
|
* @return
|
||||||
* 1= md5 found , 0= no md5 available , <0 indicates error
|
* 1= md5 found , 0= no md5 available , <0 indicates error
|
||||||
*
|
*
|
||||||
|
@ -427,7 +427,7 @@ int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
|
|||||||
|
|
||||||
if (node->type == LIBISO_FILE) {
|
if (node->type == LIBISO_FILE) {
|
||||||
file = (IsoFile *) node;
|
file = (IsoFile *) node;
|
||||||
if (file->from_old_session) {
|
if (file->from_old_session && target->appendable) {
|
||||||
ret = iso_node_get_xinfo(node, checksum_xinfo_func, &xipt);
|
ret = iso_node_get_xinfo(node, checksum_xinfo_func, &xipt);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -2696,8 +2696,11 @@ int iso_file_get_md5(IsoImage *image, IsoFile *file, char md5[16], int flag)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
memcpy(md5, image->checksum_array + ((size_t) 16) * ((size_t) idx), 16);
|
if (!(flag & 1)) {
|
||||||
ret = ISO_SUCCESS;
|
memcpy(md5, image->checksum_array + ((size_t) 16) * ((size_t) idx),
|
||||||
|
16);
|
||||||
|
}
|
||||||
|
ret = 1;
|
||||||
ex:;
|
ex:;
|
||||||
if (value != NULL)
|
if (value != NULL)
|
||||||
free(value);
|
free(value);
|
||||||
|
Loading…
Reference in New Issue
Block a user