Refactored error handling while encoding AAIP information.

Again Coverity CID 12564.
This commit is contained in:
Thomas Schmitt 2015-10-15 08:38:56 +02:00
parent b3a183fceb
commit 79e6312397
4 changed files with 47 additions and 34 deletions

View File

@ -7,7 +7,7 @@
See libisofs/aaip_0_2.h See libisofs/aaip_0_2.h
http://libburnia-project.org/wiki/AAIP http://libburnia-project.org/wiki/AAIP
Copyright (c) 2009 - 2014 Thomas Schmitt, libburnia project, GPLv2+ Copyright (c) 2009 - 2015 Thomas Schmitt, libburnia project, GPLv2+
*/ */
@ -88,26 +88,30 @@ static int aaip_encode_pair(char *name, size_t attr_length, char *attr,
no longer needed no longer needed
@param flag Bitfield for control purposes @param flag Bitfield for control purposes
bit0= set CONTINUE bit of last AAIP field to 1 bit0= set CONTINUE bit of last AAIP field to 1
@return >0 is the number of SUSP fields generated, @return >= 0 is the number of SUSP fields generated,
0 means error < 0 means error
*/ */
size_t aaip_encode(size_t num_attrs, char **names, ssize_t aaip_encode(size_t num_attrs, char **names,
size_t *value_lengths, char **values, size_t *value_lengths, char **values,
size_t *result_len, unsigned char **result, int flag) size_t *result_len, unsigned char **result, int flag)
{ {
size_t mem_size= 0, comp_size, ret; size_t mem_size= 0, comp_size;
ssize_t ret;
unsigned int number_of_fields, i, num_recs; unsigned int number_of_fields, i, num_recs;
/* Predict memory needs, number of SUSP fields and component records */ /* Predict memory needs, number of SUSP fields and component records */
*result = NULL;
*result_len= 0; *result_len= 0;
for(i= 0; i < num_attrs; i++) { for(i= 0; i < num_attrs; i++) {
ret= aaip_encode_pair(names[i], value_lengths[i], values[i], ret= aaip_encode_pair(names[i], value_lengths[i], values[i],
&num_recs, &comp_size, NULL, (size_t) 0, 1); &num_recs, &comp_size, NULL, (size_t) 0, 1);
if(ret <= 0) if(ret < 0)
return(ret); return(ret);
mem_size+= comp_size; mem_size+= comp_size;
} }
number_of_fields= mem_size / 250 + !!(mem_size % 250); number_of_fields= mem_size / 250 + !!(mem_size % 250);
if(number_of_fields == 0)
return(0);
mem_size+= number_of_fields * 5; mem_size+= number_of_fields * 5;
#ifdef Aaip_encode_debuG #ifdef Aaip_encode_debuG
@ -118,14 +122,18 @@ size_t aaip_encode(size_t num_attrs, char **names,
#endif #endif
if(*result == NULL) if(*result == NULL)
return 0; return ISO_OUT_OF_MEM;
/* Encode pairs into result */ /* Encode pairs into result */
for(i= 0; i < num_attrs; i++) { for(i= 0; i < num_attrs; i++) {
ret= aaip_encode_pair(names[i], value_lengths[i], values[i], ret= aaip_encode_pair(names[i], value_lengths[i], values[i],
&num_recs, &comp_size, *result, *result_len, 0); &num_recs, &comp_size, *result, *result_len, 0);
if(ret <= 0) if(ret < 0) {
free(*result);
*result = NULL;
*result_len = 0;
return(ret); return(ret);
}
(*result_len)+= comp_size; (*result_len)+= comp_size;
} }

View File

@ -30,12 +30,12 @@
no longer needed no longer needed
@param flag Bitfield for control purposes @param flag Bitfield for control purposes
bit0= set CONTINUE bit of last AAIP field to 1 bit0= set CONTINUE bit of last AAIP field to 1
@return >0 is the number of SUSP fields generated, @return >= 0 is the number of SUSP fields generated,
0 means error < 0 means error
*/ */
size_t aaip_encode(size_t num_attrs, char **names, ssize_t aaip_encode(size_t num_attrs, char **names,
size_t *value_lengths, char **values, size_t *value_lengths, char **values,
size_t *result_len, unsigned char **result, int flag); size_t *result_len, unsigned char **result, int flag);
/* ------ ACL representation ------ */ /* ------ ACL representation ------ */

View File

@ -500,7 +500,8 @@ static
int lfs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag) int lfs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag)
{ {
int ret; int ret;
size_t num_attrs = 0, *value_lengths = NULL, result_len, sret; size_t num_attrs = 0, *value_lengths = NULL, result_len;
ssize_t sret;
char *path = NULL, **names = NULL, **values = NULL; char *path = NULL, **names = NULL, **values = NULL;
unsigned char *result = NULL; unsigned char *result = NULL;
@ -533,10 +534,10 @@ int lfs_get_aa_string(IsoFileSource *src, unsigned char **aa_string, int flag)
else { else {
sret = aaip_encode(num_attrs, names, sret = aaip_encode(num_attrs, names,
value_lengths, values, &result_len, &result, 0); value_lengths, values, &result_len, &result, 0);
if (sret == 0) { if (sret < 0) {
ret = ISO_OUT_OF_MEM; ret = sret;
goto ex; goto ex;
} }
} }
*aa_string = result; *aa_string = result;
ret = 1; ret = 1;

View File

@ -1959,7 +1959,8 @@ int iso_node_set_attrs(IsoNode *node, size_t num_attrs, char **names,
size_t *value_lengths, char **values, int flag) size_t *value_lengths, char **values, int flag)
{ {
int ret, acl_saved = 0; int ret, acl_saved = 0;
size_t sret, result_len, m_num = 0, *m_value_lengths = NULL, i; ssize_t sret;
size_t result_len, m_num = 0, *m_value_lengths = NULL, i;
unsigned char *result = NULL; unsigned char *result = NULL;
char *a_acl = NULL, *d_acl = NULL, **m_names = NULL, **m_values = NULL; char *a_acl = NULL, *d_acl = NULL, **m_names = NULL, **m_values = NULL;
@ -1999,8 +2000,8 @@ int iso_node_set_attrs(IsoNode *node, size_t num_attrs, char **names,
} }
sret = aaip_encode(num_attrs, names, value_lengths, values, sret = aaip_encode(num_attrs, names, value_lengths, values,
&result_len, &result, 0); &result_len, &result, 0);
if (sret == 0) { if (sret < 0) {
ret = ISO_OUT_OF_MEM; ret = sret;
goto ex; goto ex;
} }
@ -2010,20 +2011,23 @@ int iso_node_set_attrs(IsoNode *node, size_t num_attrs, char **names,
free(result); free(result);
goto ex; goto ex;
} }
ret = iso_node_add_xinfo(node, aaip_xinfo_func, result); if (sret > 0) {
if (ret < 0) ret = iso_node_add_xinfo(node, aaip_xinfo_func, result);
goto ex;
if (ret == 0) {
/* >>> something is messed up with xinfo: an aa_string still exists */;
ret = ISO_ERROR;
goto ex;
}
if (acl_saved) {
ret = iso_node_set_acl_text(node, a_acl, d_acl, 0);
if (ret < 0) if (ret < 0)
goto ex; goto ex;
if (ret == 0) {
/* >>> something is messed up with xinfo:
an aa_string still exists */;
ret = ISO_ERROR;
goto ex;
}
if (acl_saved) {
ret = iso_node_set_acl_text(node, a_acl, d_acl, 0);
if (ret < 0)
goto ex;
}
} }
ret = 1; ret = 1;
ex:; ex:;