int no_missing_error)
{
size_t datum_len = sys_lgetxattr(fname, name, NULL, 0);
+ size_t extra_len = *len_ptr;
char *ptr;
+ *len_ptr = datum_len;
+
if (datum_len == (size_t)-1) {
if (errno == ENOTSUP || no_missing_error)
return NULL;
return NULL;
}
- if (datum_len + *len_ptr < datum_len /* checks for overflow */
- || !(ptr = new_array(char, datum_len + *len_ptr)))
+ if (!datum_len && !extra_len)
+ extra_len = 1; /* request non-zero amount of memory */
+ if (datum_len + extra_len < datum_len /* checks for overflow */
+ || !(ptr = new_array(char, datum_len + extra_len)))
out_of_memory("get_xattr_data");
- *len_ptr = datum_len;
-
if (datum_len) {
size_t len = sys_lgetxattr(fname, name, ptr, datum_len);
if (len != datum_len) {