Add ntfs_sid_to_mbs_size() and ntfs_sid_to_mbs().
(Logical change 1.368)edge.strict_endians
parent
e44d450539
commit
8d9353c062
|
@ -40,7 +40,7 @@ const GUID *const zero_guid = &__zero_guid;
|
|||
|
||||
/**
|
||||
* ntfs_guid_is_zero - check if a GUID is zero
|
||||
* @guid: guid to check
|
||||
* @guid: [IN] guid to check
|
||||
*
|
||||
* Return TRUE if @guid is a valid pointer to a GUID and it is the zero GUID
|
||||
* and FALSE otherwise.
|
||||
|
@ -52,8 +52,8 @@ BOOL ntfs_guid_is_zero(const GUID *guid)
|
|||
|
||||
/**
|
||||
* ntfs_guid_to_mbs - convert a GUID to a multi byte string
|
||||
* @guid: guid to convert
|
||||
* @guid_str: string in which to return the GUID (optional)
|
||||
* @guid: [IN] guid to convert
|
||||
* @guid_str: [OUT] string in which to return the GUID (optional)
|
||||
*
|
||||
* Convert the GUID pointed to by @guid to a multi byte string of the form
|
||||
* "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX". Therefore, @guid_str (if not NULL)
|
||||
|
@ -83,7 +83,7 @@ char *ntfs_guid_to_mbs(const GUID *guid, char *guid_str)
|
|||
}
|
||||
res = snprintf(_guid_str, 37,
|
||||
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
le32_to_cpu(guid->data1),
|
||||
(unsigned int)le32_to_cpu(guid->data1),
|
||||
le16_to_cpu(guid->data2), le16_to_cpu(guid->data3),
|
||||
guid->data4[0], guid->data4[1],
|
||||
guid->data4[2], guid->data4[3], guid->data4[4],
|
||||
|
@ -95,3 +95,149 @@ char *ntfs_guid_to_mbs(const GUID *guid, char *guid_str)
|
|||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* ntfs_sid_to_mbs_size - determine maximum size for the string of a SID
|
||||
* @sid: [IN] SID for which to determine the maximum string size
|
||||
*
|
||||
* Determine the maximum multi byte string size in bytes which is needed to
|
||||
* store the standard textual representation of the SID pointed to by @sid.
|
||||
* See ntfs_sid_to_mbs(), below.
|
||||
*
|
||||
* On success return the maximum number of bytes needed to store the multi byte
|
||||
* string and on failure return -1 with errno set to the error code.
|
||||
*/
|
||||
int ntfs_sid_to_mbs_size(const SID *sid)
|
||||
{
|
||||
int size, i;
|
||||
|
||||
if (!ntfs_sid_is_valid(sid)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
/* Start with "S-". */
|
||||
size = 2;
|
||||
/*
|
||||
* Add the SID_REVISION. Hopefully the compiler will optimize this
|
||||
* away as SID_REVISION is a constant.
|
||||
*/
|
||||
for (i = SID_REVISION; i > 0; i /= 10)
|
||||
size++;
|
||||
/* Add the "-". */
|
||||
size++;
|
||||
/*
|
||||
* Add the identifier authority. If it needs to be in decimal, the
|
||||
* maximum is 2^32-1 = 4294967295 = 10 characters. If it needs to be
|
||||
* in hexadecimal, then maximum is 0x665544332211 = 14 characters.
|
||||
*/
|
||||
if (!sid->identifier_authority.high_part)
|
||||
size += 10;
|
||||
else
|
||||
size += 14;
|
||||
/*
|
||||
* Finally, add the sub authorities. For each we have a "-" followed
|
||||
* by a decimal which can be up to 2^32-1 = 4294967295 = 10 characters.
|
||||
*/
|
||||
size += (1 + 10) * sid->sub_authority_count;
|
||||
/* We need the zero byte at the end, too. */
|
||||
size++;
|
||||
return size * sizeof(char);
|
||||
}
|
||||
|
||||
/**
|
||||
* ntfs_sid_to_mbs - convert a SID to a multi byte string
|
||||
* @sid: [IN] SID to convert
|
||||
* @sid_str: [OUT] string in which to return the SID (optional)
|
||||
* @sid_str_size: [IN] size in bytes of @sid_str
|
||||
*
|
||||
* Convert the SID pointed to by @sid to its standard textual representation.
|
||||
* @sid_str (if not NULL) needs to be able to store at least
|
||||
* ntfs_sid_to_mbs_size() bytes. @sid_str_size is the size in bytes of
|
||||
* @sid_str if @sid_str is not NULL.
|
||||
*
|
||||
* The standard textual representation of the SID is of the form:
|
||||
* S-R-I-S-S...
|
||||
* Where:
|
||||
* - The first "S" is the literal character 'S' identifying the following
|
||||
* digits as a SID.
|
||||
* - R is the revision level of the SID expressed as a sequence of digits
|
||||
* in decimal.
|
||||
* - I is the 48-bit identifier_authority, expressed as digits in decimal,
|
||||
* if I < 2^32, or hexadecimal prefixed by "0x", if I >= 2^32.
|
||||
* - S... is one or more sub_authority values, expressed as digits in
|
||||
* decimal.
|
||||
*
|
||||
* If @sid_str is not NULL it will contain the converted SUID on return. If it
|
||||
* is NULL a string will be allocated and this will be returned. The caller is
|
||||
* responsible for free()ing the string in that case.
|
||||
*
|
||||
* On success return the converted string and on failure return NULL with errno
|
||||
* set to the error code.
|
||||
*/
|
||||
char *ntfs_sid_to_mbs(const SID *sid, char *sid_str, size_t sid_str_size)
|
||||
{
|
||||
u64 u;
|
||||
char *s;
|
||||
size_t cnt;
|
||||
int i, j;
|
||||
|
||||
/*
|
||||
* No need to check @sid if !@sid_str since ntfs_sid_to_mbs_size() will
|
||||
* check @sid, too. 8 is the minimum SID string size.
|
||||
*/
|
||||
if (sid_str && (sid_str_size < 8 || !ntfs_sid_is_valid(sid))) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
/* Allocate string if not provided. */
|
||||
if (!sid_str) {
|
||||
cnt = ntfs_sid_to_mbs_size(sid);
|
||||
if (cnt < 0)
|
||||
return NULL;
|
||||
s = malloc(cnt);
|
||||
if (!s)
|
||||
return s;
|
||||
sid_str = s;
|
||||
/* So we know we allocated it. */
|
||||
sid_str_size = 0;
|
||||
} else {
|
||||
s = sid_str;
|
||||
cnt = sid_str_size;
|
||||
}
|
||||
/* Start with "S-R-". */
|
||||
i = snprintf(s, cnt, "S-%c-", (char)sid->revision);
|
||||
if (i < 0 || i >= cnt)
|
||||
goto err_out;
|
||||
s += i;
|
||||
cnt -= i;
|
||||
/* Add the identifier authority. */
|
||||
for (u = i = 0, j = 40; i < 6; i++, j -= 8)
|
||||
u += (u64)sid->identifier_authority.value[i] << j;
|
||||
if (!sid->identifier_authority.high_part)
|
||||
i = snprintf(s, cnt, "%lu", (unsigned long)u);
|
||||
else
|
||||
i = snprintf(s, cnt, "0x%llx", (unsigned long long)u);
|
||||
if (i < 0 || i >= cnt)
|
||||
goto err_out;
|
||||
s += i;
|
||||
cnt -= i;
|
||||
/* Finally, add the sub authorities. */
|
||||
for (i = 0; i < sid->sub_authority_count; i++) {
|
||||
j = snprintf(s, cnt, "-%u", (unsigned int)
|
||||
le32_to_cpu(sid->sub_authority[i]));
|
||||
if (j < 0 || j >= cnt)
|
||||
goto err_out;
|
||||
s += j;
|
||||
cnt -= j;
|
||||
}
|
||||
return sid_str;
|
||||
err_out:
|
||||
if (i >= cnt)
|
||||
i = EMSGSIZE;
|
||||
else
|
||||
i = errno;
|
||||
if (!sid_str_size)
|
||||
free(sid_str);
|
||||
errno = i;
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue