More bug fixes about "default" ACL.

Made aaip_xinfo_func() available unconditionally.
This commit is contained in:
Thomas Schmitt 2009-01-28 12:37:59 +01:00
parent b53ef57ac6
commit 6dee6e4c20
4 changed files with 46 additions and 26 deletions

View File

@ -498,16 +498,16 @@ int aaip_encode_both_acl(char *a_acl_text, char *d_acl_text, mode_t st_mode,
if(ret <= 0) if(ret <= 0)
goto ex; goto ex;
} }
if(a_acl == NULL) { if(a_acl == NULL || a_acl_len == 0) {
acl= d_acl; acl= d_acl;
d_acl= NULL; d_acl= NULL;
acl_len= d_acl_len; acl_len= d_acl_len;
} else if (d_acl == NULL) { } else if (d_acl == NULL || d_acl_len == 0) {
acl= a_acl; acl= a_acl;
a_acl= NULL; a_acl= NULL;
acl_len= a_acl_len; acl_len= a_acl_len;
} else { } else {
acl= calloc(a_acl_len + d_acl_len + 1, 1); acl= calloc(a_acl_len + d_acl_len, 1);
if(acl == NULL) if(acl == NULL)
{ret = -1; goto ex;} {ret = -1; goto ex;}
memcpy(acl, a_acl, a_acl_len); memcpy(acl, a_acl, a_acl_len);
@ -2007,7 +2007,7 @@ int aaip_decode_acl(unsigned char *data, size_t num_data, size_t *consumed,
} else if(type == Aaip_SWITCH_MARK) { } else if(type == Aaip_SWITCH_MARK) {
/* Indicate to caller: end of desired ACL type access/default */ /* Indicate to caller: end of desired ACL type access/default */
if((perm & Aaip_EXEC) ^ (!!(flag & 2))) if((perm & Aaip_EXEC) ^ (!!(flag & 2)))
return(2); {ret= 2; goto ex;}
} else if(type == Aaip_ACL_USER_N) { } else if(type == Aaip_ACL_USER_N) {
/* determine username from uid */ /* determine username from uid */
uid= 0; uid= 0;
@ -2043,9 +2043,11 @@ int aaip_decode_acl(unsigned char *data, size_t num_data, size_t *consumed,
if(ret <= 0) if(ret <= 0)
return(-2); return(-2);
} }
ret= 1;
ex:;
if(flag & 1) if(flag & 1)
*acl_text_fill= w_size + 1; *acl_text_fill= w_size + 1;
return(1); return(ret);
} }

View File

@ -4222,14 +4222,12 @@ void iso_stream_get_id(IsoStream *stream, unsigned int *fs_id, dev_t *dev_id,
*/ */
#ifdef Libisofs_with_aaiP /* ts A90114 */
/** /**
* Function to identify and manage AA strings as xinfo of IsoNode * Function to identify and manage AA strings as xinfo of IsoNode
*/ */
int aaip_xinfo_func(void *data, int flag); int aaip_xinfo_func(void *data, int flag);
#endif /* Libisofs_with_aaiP */
/* ts A90116 */ /* ts A90116 */
/** /**
@ -4292,6 +4290,11 @@ int iso_node_set_acl_text(IsoNode *node, char *text, int flag);
/* -------- This is an interface to the ACL of the local filesystem -------- */ /* -------- This is an interface to the ACL of the local filesystem -------- */
/**
* libisofs has an internal system dependent adapter to ACL operations. For
* the sake of completeness and simplicity it exposes this functionality to
* its applications which might want to get and set ACLs from local files.
*/
/* ts A90127 */ /* ts A90127 */
/** /**

View File

@ -277,6 +277,33 @@ const char *iso_node_get_name(const IsoNode *node)
return node->name; return node->name;
} }
/* ta A90128 */
/**
* See API function iso_node_set_permissions()
*
* @param flag bit0= do not adjust ACL
* @return >0 success , <0 error
*/
static
int iso_node_set_perms_internal(IsoNode *node, mode_t mode, int flag)
{
int ret;
node->mode = (node->mode & S_IFMT) | (mode & ~S_IFMT);
#ifdef Libisofs_with_aaiP
/* ts A90119 */
/* If the node has ACL info : update ACL */
ret = 1;
if (!(flag & 1))
ret = iso_node_set_acl_text(node, "", 2);
return ret;
#endif
}
/** /**
* Set the permissions for the node. This attribute is only useful when * Set the permissions for the node. This attribute is only useful when
* Rock Ridge extensions are enabled. * Rock Ridge extensions are enabled.
@ -288,18 +315,7 @@ const char *iso_node_get_name(const IsoNode *node)
*/ */
void iso_node_set_permissions(IsoNode *node, mode_t mode) void iso_node_set_permissions(IsoNode *node, mode_t mode)
{ {
node->mode = (node->mode & S_IFMT) | (mode & ~S_IFMT); iso_node_set_perms_internal(node, mode, 0);
#ifdef Libisofs_with_aaiP
/* ts A90119 */
/* If the node has ACL info : update ACL */;
iso_node_set_acl_text(node, "", 2);
/* >>> actually iso_node_set_permissions() would need a return value now */
#endif
} }
/** /**
@ -1481,12 +1497,13 @@ int iso_decode_acl(unsigned char *v_data, size_t v_len, size_t *consumed,
{ {
int ret; int ret;
*text= NULL;
ret = aaip_decode_acl(v_data, v_len, ret = aaip_decode_acl(v_data, v_len,
consumed, NULL, (size_t) 0, text_fill, 1); consumed, NULL, (size_t) 0, text_fill, 1);
if (ret <= 0) if (ret <= 0)
return 0; return 0;
if (text_fill == 0) if (*text_fill == 0)
return 0; return ret;
*text = calloc(*text_fill + 42, 1); /* 42 for aaip_update_acl_st_mode */ *text = calloc(*text_fill + 42, 1); /* 42 for aaip_update_acl_st_mode */
if (*text == NULL) if (*text == NULL)
return ISO_OUT_OF_MEM; return ISO_OUT_OF_MEM;
@ -1494,6 +1511,7 @@ int iso_decode_acl(unsigned char *v_data, size_t v_len, size_t *consumed,
consumed, *text, *text_fill, text_fill, 0); consumed, *text, *text_fill, text_fill, 0);
if (ret <= 0) { if (ret <= 0) {
free(*text); free(*text);
*text= NULL;
return 0; return 0;
} }
return ret; return ret;
@ -1773,7 +1791,7 @@ update_perms:;
ret = aaip_cleanout_st_mode(acl_text, &st_mode, 4); ret = aaip_cleanout_st_mode(acl_text, &st_mode, 4);
if (ret < 0) if (ret < 0)
goto bad_decode; goto bad_decode;
iso_node_set_permissions(node, st_mode); iso_node_set_perms_internal(node, st_mode, 1);
} }
ret = 1; ret = 1;

View File

@ -739,7 +739,6 @@ int susp_add_ES(Ecma119Image *t, struct susp_info *susp, int to_ce, int seqno)
} }
#ifdef Libisofs_with_aaiP
/* ts A90114 */ /* ts A90114 */
int aaip_xinfo_func(void *data, int flag) int aaip_xinfo_func(void *data, int flag)
@ -750,8 +749,6 @@ int aaip_xinfo_func(void *data, int flag)
return 1; return 1;
} }
#endif /* Libisofs_with_aaiP */
/* ts A90117 */ /* ts A90117 */
/** /**