Errors in writes to /dev/ecryptfs were being incorrectly reported by
returning 0 or the value of the original write count.
This patch clears up the return code assignment in error paths.
Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
__be32 counter_nbo;
u32 seq;
size_t packet_size, packet_size_length, i;
__be32 counter_nbo;
u32 seq;
size_t packet_size, packet_size_length, i;
char *data;
uid_t euid = current_euid();
unsigned char packet_size_peek[3];
char *data;
uid_t euid = current_euid();
unsigned char packet_size_peek[3];
} else if (count == (1 + 4)) {
/* Likely a harmless MSG_HELO or MSG_QUIT - no packet length */
goto memdup;
} else if (count == (1 + 4)) {
/* Likely a harmless MSG_HELO or MSG_QUIT - no packet length */
goto memdup;
&packet_size_length);
if (rc) {
printk(KERN_WARNING "%s: Error parsing packet length; "
&packet_size_length);
if (rc) {
printk(KERN_WARNING "%s: Error parsing packet length; "
- "rc = [%d]\n", __func__, rc);
+ "rc = [%zd]\n", __func__, rc);
if (IS_ERR(data)) {
printk(KERN_ERR "%s: memdup_user returned error [%ld]\n",
__func__, PTR_ERR(data));
if (IS_ERR(data)) {
printk(KERN_ERR "%s: memdup_user returned error [%ld]\n",
__func__, PTR_ERR(data));
i = 0;
switch (data[i++]) {
case ECRYPTFS_MSG_RESPONSE:
i = 0;
switch (data[i++]) {
case ECRYPTFS_MSG_RESPONSE:
__func__,
(1 + 4 + 1 + sizeof(struct ecryptfs_message)),
count);
__func__,
(1 + 4 + 1 + sizeof(struct ecryptfs_message)),
count);
goto out_free;
}
memcpy(&counter_nbo, &data[i], 4);
goto out_free;
}
memcpy(&counter_nbo, &data[i], 4);
rc = ecryptfs_miscdev_response(&data[i], packet_size,
euid, current_user_ns(),
task_pid(current), seq);
rc = ecryptfs_miscdev_response(&data[i], packet_size,
euid, current_user_ns(),
task_pid(current), seq);
printk(KERN_WARNING "%s: Failed to deliver miscdev "
printk(KERN_WARNING "%s: Failed to deliver miscdev "
- "response to requesting operation; rc = [%d]\n",
+ "response to requesting operation; rc = [%zd]\n",
break;
case ECRYPTFS_MSG_HELO:
case ECRYPTFS_MSG_QUIT:
break;
case ECRYPTFS_MSG_HELO:
case ECRYPTFS_MSG_QUIT:
ecryptfs_printk(KERN_WARNING, "Dropping miscdev "
"message of unrecognized type [%d]\n",
data[0]);
ecryptfs_printk(KERN_WARNING, "Dropping miscdev "
"message of unrecognized type [%d]\n",
data[0]);
+ rc = -EINVAL;
+ goto out_free;