Add memcpy_safe
ISO/IEC 9899:1999 §7.21.1/2 says: Where an argument declared as size_t n specifies the length of the array for a function, n can have the value zero on a call to that function. Unless explicitly stated otherwise in the description of a particular function in this subclause, pointer arguments on such a call shall still have valid values, as described in 7.1.4. In base64_append_width memcpy was called as memcpy(x, NULL, 0). GCC 4.9 started making use of this and assumes This worked fine under -O0, but does something strange under -O3. This patch fixes a bug in base64_append_width(), fixes a possible bug in journal_file_append_entry_internal(), and makes use of the new function to simplify the code in other places.
This commit is contained in:
@@ -56,12 +56,7 @@ static int option_append(uint8_t options[], size_t size, size_t *offset,
|
||||
options[*offset] = code;
|
||||
options[*offset + 1] = optlen;
|
||||
|
||||
if (optlen) {
|
||||
assert(optval);
|
||||
|
||||
memcpy(&options[*offset + 2], optval, optlen);
|
||||
}
|
||||
|
||||
memcpy_safe(&options[*offset + 2], optval, optlen);
|
||||
*offset += optlen + 2;
|
||||
|
||||
break;
|
||||
|
||||
@@ -73,8 +73,7 @@ int dhcp6_option_append(uint8_t **buf, size_t *buflen, uint16_t code,
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (optval)
|
||||
memcpy(*buf, optval, optlen);
|
||||
memcpy_safe(*buf, optval, optlen);
|
||||
|
||||
*buf += optlen;
|
||||
*buflen -= optlen;
|
||||
|
||||
@@ -112,14 +112,9 @@ static DHCPMessage *create_message(uint8_t *options, uint16_t optlen,
|
||||
message = malloc0(len);
|
||||
assert_se(message);
|
||||
|
||||
if (options && optlen)
|
||||
memcpy(&message->options, options, optlen);
|
||||
|
||||
if (file && filelen <= 128)
|
||||
memcpy(&message->file, file, filelen);
|
||||
|
||||
if (sname && snamelen <= 64)
|
||||
memcpy(&message->sname, sname, snamelen);
|
||||
memcpy_safe(&message->options, options, optlen);
|
||||
memcpy_safe(&message->file, file, filelen);
|
||||
memcpy_safe(&message->sname, sname, snamelen);
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user