Commit 5a5bcd43 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'char-misc-5.13-rc1-round2' of...

Merge tag 'char-misc-5.13-rc1-round2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc driver fixes from Greg KH:
 "Here are two char/misc fixes for 5.13-rc1 to resolve reported issues.

  The first is a bugfix for the nitro_enclaves driver that fixed some
  important problems. The second was a dyndbg bugfix that resolved some
  reported problems in dynamic debugging control.

  Both have been in linux-next for a while with no reported issues"

* tag 'char-misc-5.13-rc1-round2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  dyndbg: fix parsing file query without a line-range suffix
  nitro_enclaves: Fix stale file descriptors on failed usercopy
parents d8cb379c 7b1ae248
...@@ -1524,7 +1524,8 @@ static const struct file_operations ne_enclave_fops = { ...@@ -1524,7 +1524,8 @@ static const struct file_operations ne_enclave_fops = {
* enclave file descriptor to be further used for enclave * enclave file descriptor to be further used for enclave
* resources handling e.g. memory regions and CPUs. * resources handling e.g. memory regions and CPUs.
* @ne_pci_dev : Private data associated with the PCI device. * @ne_pci_dev : Private data associated with the PCI device.
* @slot_uid: Generated unique slot id associated with an enclave. * @slot_uid: User pointer to store the generated unique slot id
* associated with an enclave to.
* *
* Context: Process context. This function is called with the ne_pci_dev enclave * Context: Process context. This function is called with the ne_pci_dev enclave
* mutex held. * mutex held.
...@@ -1532,7 +1533,7 @@ static const struct file_operations ne_enclave_fops = { ...@@ -1532,7 +1533,7 @@ static const struct file_operations ne_enclave_fops = {
* * Enclave fd on success. * * Enclave fd on success.
* * Negative return value on failure. * * Negative return value on failure.
*/ */
static int ne_create_vm_ioctl(struct ne_pci_dev *ne_pci_dev, u64 *slot_uid) static int ne_create_vm_ioctl(struct ne_pci_dev *ne_pci_dev, u64 __user *slot_uid)
{ {
struct ne_pci_dev_cmd_reply cmd_reply = {}; struct ne_pci_dev_cmd_reply cmd_reply = {};
int enclave_fd = -1; int enclave_fd = -1;
...@@ -1634,7 +1635,18 @@ static int ne_create_vm_ioctl(struct ne_pci_dev *ne_pci_dev, u64 *slot_uid) ...@@ -1634,7 +1635,18 @@ static int ne_create_vm_ioctl(struct ne_pci_dev *ne_pci_dev, u64 *slot_uid)
list_add(&ne_enclave->enclave_list_entry, &ne_pci_dev->enclaves_list); list_add(&ne_enclave->enclave_list_entry, &ne_pci_dev->enclaves_list);
*slot_uid = ne_enclave->slot_uid; if (copy_to_user(slot_uid, &ne_enclave->slot_uid, sizeof(ne_enclave->slot_uid))) {
/*
* As we're holding the only reference to 'enclave_file', fput()
* will call ne_enclave_release() which will do a proper cleanup
* of all so far allocated resources, leaving only the unused fd
* for us to free.
*/
fput(enclave_file);
put_unused_fd(enclave_fd);
return -EFAULT;
}
fd_install(enclave_fd, enclave_file); fd_install(enclave_fd, enclave_file);
...@@ -1671,34 +1683,13 @@ static long ne_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ...@@ -1671,34 +1683,13 @@ static long ne_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
switch (cmd) { switch (cmd) {
case NE_CREATE_VM: { case NE_CREATE_VM: {
int enclave_fd = -1; int enclave_fd = -1;
struct file *enclave_file = NULL;
struct ne_pci_dev *ne_pci_dev = ne_devs.ne_pci_dev; struct ne_pci_dev *ne_pci_dev = ne_devs.ne_pci_dev;
int rc = -EINVAL; u64 __user *slot_uid = (void __user *)arg;
u64 slot_uid = 0;
mutex_lock(&ne_pci_dev->enclaves_list_mutex); mutex_lock(&ne_pci_dev->enclaves_list_mutex);
enclave_fd = ne_create_vm_ioctl(ne_pci_dev, slot_uid);
enclave_fd = ne_create_vm_ioctl(ne_pci_dev, &slot_uid);
if (enclave_fd < 0) {
rc = enclave_fd;
mutex_unlock(&ne_pci_dev->enclaves_list_mutex);
return rc;
}
mutex_unlock(&ne_pci_dev->enclaves_list_mutex); mutex_unlock(&ne_pci_dev->enclaves_list_mutex);
if (copy_to_user((void __user *)arg, &slot_uid, sizeof(slot_uid))) {
enclave_file = fget(enclave_fd);
/* Decrement file refs to have release() called. */
fput(enclave_file);
fput(enclave_file);
put_unused_fd(enclave_fd);
return -EFAULT;
}
return enclave_fd; return enclave_fd;
} }
......
...@@ -396,7 +396,7 @@ static int ddebug_parse_query(char *words[], int nwords, ...@@ -396,7 +396,7 @@ static int ddebug_parse_query(char *words[], int nwords,
/* tail :$info is function or line-range */ /* tail :$info is function or line-range */
fline = strchr(query->filename, ':'); fline = strchr(query->filename, ':');
if (!fline) if (!fline)
break; continue;
*fline++ = '\0'; *fline++ = '\0';
if (isalpha(*fline) || *fline == '*' || *fline == '?') { if (isalpha(*fline) || *fline == '*' || *fline == '?') {
/* take as function name */ /* take as function name */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment