Closed memory leak with Rock Ridge character set conversion failure.

Coverity CID 12562.
This commit is contained in:
Thomas Schmitt 2015-10-09 13:25:42 +02:00
parent e35cb88328
commit d04f438ba1
2 changed files with 21 additions and 10 deletions

View File

@ -383,9 +383,7 @@ int iso_get_rr_name(IsoWriteOpts *opts, char *input_charset,
iso_msg_submit(imgid, ISO_FILENAME_WRONG_CHARSET, ret, iso_msg_submit(imgid, ISO_FILENAME_WRONG_CHARSET, ret,
"Charset conversion error. Cannot convert %s from %s to %s", "Charset conversion error. Cannot convert %s from %s to %s",
str, input_charset, output_charset); str, input_charset, output_charset);
*name = NULL;
/* use the original name, it's the best we can do */
ret = iso_clone_mem(str, name, 0);
return ISO_FILENAME_WRONG_CHARSET; return ISO_FILENAME_WRONG_CHARSET;
} }
@ -1179,9 +1177,12 @@ int susp_calc_nm_sl_al(Ecma119Image *t, Ecma119Node *n, size_t space,
} }
} }
namelen = 0;
name = get_rr_fname(t, n->node->name); name = get_rr_fname(t, n->node->name);
namelen = strlen(name); if (name != NULL) {
free(name); namelen = strlen(name);
free(name);
}
if (flag & 1) { if (flag & 1) {
/* Account for 28 bytes of CE field */ /* Account for 28 bytes of CE field */
@ -1741,9 +1742,12 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
uint8_t **comps= NULL; /* components of the SL field */ uint8_t **comps= NULL; /* components of the SL field */
size_t n_comp = 0; /* number of components */ size_t n_comp = 0; /* number of components */
namelen = 0;
name = get_rr_fname(t, n->node->name); name = get_rr_fname(t, n->node->name);
namelen = strlen(name); if (name != NULL) {
namelen = strlen(name);
free(name);
}
sua_free = space - info->suf_len; sua_free = space - info->suf_len;
/* Try whether NM, SL, AL will fit into SUA */ /* Try whether NM, SL, AL will fit into SUA */
@ -1787,6 +1791,13 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
int cew = (nm_type == 1); /* are we writing to CE? */ int cew = (nm_type == 1); /* are we writing to CE? */
dest = get_rr_fname(t, ((IsoSymlink*)n->node)->dest); dest = get_rr_fname(t, ((IsoSymlink*)n->node)->dest);
if (dest == NULL)
dest = strdup("");
if (dest == NULL) {
ret = ISO_OUT_OF_MEM;
goto add_susp_cleanup;
}
prev = dest; prev = dest;
cur = strchr(prev, '/'); cur = strchr(prev, '/');
while (1) { while (1) {
@ -2123,7 +2134,8 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
add_susp_cleanup: ; add_susp_cleanup: ;
free(name); free(name);
free(dest); if (dest != NULL)
free(dest);
susp_info_free(info); susp_info_free(info);
return ret; return ret;
} }

View File

@ -361,8 +361,7 @@ int read_zisofs_ZF(struct susp_sys_user_entry *zf, uint8_t algorithm[2],
uint32_t *uncompressed_size, int flag); uint32_t *uncompressed_size, int flag);
/** /**
* Convert a RR filename to the requested charset. On any conversion error, * Convert a RR filename to the requested charset.
* the original name will be used.
* @param flag bit0= do not issue error messages * @param flag bit0= do not issue error messages
*/ */
int iso_get_rr_name(IsoWriteOpts *opts, char *input_charset, int iso_get_rr_name(IsoWriteOpts *opts, char *input_charset,