Bug fix: Very large ACL texts led to SIGSEGV with -setfacl* commands. Thanks Eliska Svobodova.
This commit is contained in:
parent
397551f9d4
commit
321a0476fa
@ -831,12 +831,13 @@ int Xorriso_option_session_log(struct XorrisO *xorriso, char *path, int flag)
|
|||||||
int Xorriso_option_setfacl_listi(struct XorrisO *xorriso, char *path, int flag)
|
int Xorriso_option_setfacl_listi(struct XorrisO *xorriso, char *path, int flag)
|
||||||
{
|
{
|
||||||
int ret, eaten, line_size;
|
int ret, eaten, line_size;
|
||||||
size_t buf_size= 0, buf_add= 64 * 1024, l, linecount= 0;
|
size_t buf_size= 0, buf_add, l, linecount= 0, diff_buf_wpt;
|
||||||
char *line= NULL, *buf= NULL, *wpt, *new_buf, limit_text[80];
|
char *line= NULL, *buf= NULL, *wpt, *new_buf, limit_text[80];
|
||||||
char *file_path= NULL, *uid= NULL, *gid= NULL;
|
char *file_path= NULL, *uid= NULL, *gid= NULL;
|
||||||
FILE *fp= NULL;
|
FILE *fp= NULL;
|
||||||
|
|
||||||
line_size= SfileadrL * 4;
|
line_size= SfileadrL * 4;
|
||||||
|
buf_add= line_size * 4;
|
||||||
Xorriso_alloc_meM(line, char, line_size);
|
Xorriso_alloc_meM(line, char, line_size);
|
||||||
Xorriso_alloc_meM(file_path, char, SfileadrL);
|
Xorriso_alloc_meM(file_path, char, SfileadrL);
|
||||||
Xorriso_alloc_meM(uid, char, 161);
|
Xorriso_alloc_meM(uid, char, 161);
|
||||||
@ -923,11 +924,13 @@ int Xorriso_option_setfacl_listi(struct XorrisO *xorriso, char *path, int flag)
|
|||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||||
ret= 0; goto ex;
|
ret= 0; goto ex;
|
||||||
}
|
}
|
||||||
|
diff_buf_wpt= wpt - buf;
|
||||||
buf_size+= buf_add;
|
buf_size+= buf_add;
|
||||||
new_buf= realloc(buf, buf_size);
|
new_buf= realloc(buf, buf_size);
|
||||||
if(new_buf == NULL)
|
if(new_buf == NULL)
|
||||||
goto out_of_mem;
|
goto out_of_mem;
|
||||||
buf= new_buf;
|
buf= new_buf;
|
||||||
|
wpt= buf + diff_buf_wpt;
|
||||||
}
|
}
|
||||||
memcpy(wpt, line, l);
|
memcpy(wpt, line, l);
|
||||||
*(wpt + l)= '\n';
|
*(wpt + l)= '\n';
|
||||||
@ -989,9 +992,11 @@ int Xorriso_option_setfacli(struct XorrisO *xorriso, char *acl_text,
|
|||||||
ret= Xorriso_normalize_acl_text(xorriso, acl_text,
|
ret= Xorriso_normalize_acl_text(xorriso, acl_text,
|
||||||
&access_acl_text, &default_acl_text, 0);
|
&access_acl_text, &default_acl_text, 0);
|
||||||
if(access_acl_text != NULL && default_acl_text != NULL) {
|
if(access_acl_text != NULL && default_acl_text != NULL) {
|
||||||
sprintf(xorriso->info_text, "Access-ACL :\n%s", access_acl_text);
|
strcpy(xorriso->info_text, "Access-ACL :\n");
|
||||||
|
Xorriso_set_info_text(xorriso, access_acl_text, 2000, 1);
|
||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||||
sprintf(xorriso->info_text, "Default-ACL :\n%s", default_acl_text);
|
strcpy(xorriso->info_text, "Default-ACL :\n");
|
||||||
|
Xorriso_set_info_text(xorriso, default_acl_text, 2000, 1);
|
||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||||
} else if(access_acl_text == NULL && default_acl_text == NULL) {
|
} else if(access_acl_text == NULL && default_acl_text == NULL) {
|
||||||
sprintf(xorriso->info_text, "Will delete Access-ACL and Default-ACL");
|
sprintf(xorriso->info_text, "Will delete Access-ACL and Default-ACL");
|
||||||
|
@ -4707,3 +4707,27 @@ char *Xorriso_esc_filepath(struct XorrisO *xorriso,
|
|||||||
return(out_text);
|
return(out_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @param flag bit=add to existing info_text
|
||||||
|
*/
|
||||||
|
int Xorriso_set_info_text(struct XorrisO *xorriso, char *text,
|
||||||
|
size_t trunc_len, int flag)
|
||||||
|
{
|
||||||
|
size_t offst= 0, maxl;
|
||||||
|
|
||||||
|
maxl= sizeof(xorriso->info_text) - 1;
|
||||||
|
if(flag & 1)
|
||||||
|
offst= strlen(xorriso->info_text);
|
||||||
|
if(offst >= maxl)
|
||||||
|
return(0);
|
||||||
|
maxl-= offst;
|
||||||
|
if(maxl > trunc_len)
|
||||||
|
maxl= trunc_len;
|
||||||
|
strncpy(xorriso->info_text + offst, text, maxl + 1);
|
||||||
|
if(strlen(text) > maxl) {
|
||||||
|
strcpy(xorriso->info_text + offst + maxl - 12, "#[truncated]");
|
||||||
|
return(2);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -105,6 +105,9 @@ int Xorriso_named_pipe_loop(struct XorrisO *xorriso,
|
|||||||
char *Xorriso_esc_filepath(struct XorrisO *xorriso,
|
char *Xorriso_esc_filepath(struct XorrisO *xorriso,
|
||||||
char *in_text, char *out_text, int flag);
|
char *in_text, char *out_text, int flag);
|
||||||
|
|
||||||
|
int Xorriso_set_info_text(struct XorrisO *xorriso, char *text,
|
||||||
|
size_t trunc_len, int flag);
|
||||||
|
|
||||||
#ifdef Xorriso_with_editlinE
|
#ifdef Xorriso_with_editlinE
|
||||||
int Xorriso__shutdown_editline(int flag);
|
int Xorriso__shutdown_editline(int flag);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2019.07.22.181418"
|
#define Xorriso_timestamP "2019.07.24.073750"
|
||||||
|
Loading…
Reference in New Issue
Block a user