summaryrefslogtreecommitdiff
path: root/pkg/libfido2/patch
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2019-11-03 12:08:12 -0800
committerMichael Forney <mforney@mforney.org>2019-11-03 13:13:44 -0800
commitc2e4d05a2baf81e0f6b26fd932cfc963de6c88f3 (patch)
treec3c3878012fa5c97e9e372c67cb8f1bf4baf81f7 /pkg/libfido2/patch
parent479b4a9313cd551db129a7a5d399d4a2975f1fb9 (diff)
Add libfido2 git
Diffstat (limited to 'pkg/libfido2/patch')
-rw-r--r--pkg/libfido2/patch/0001-Rename-log_-symbols-to-prevent-conflict-when-linking.patch41
-rw-r--r--pkg/libfido2/patch/0002-hid_linux-Use-sysfs-instead-of-libudev.patch192
2 files changed, 233 insertions, 0 deletions
diff --git a/pkg/libfido2/patch/0001-Rename-log_-symbols-to-prevent-conflict-when-linking.patch b/pkg/libfido2/patch/0001-Rename-log_-symbols-to-prevent-conflict-when-linking.patch
new file mode 100644
index 00000000..9b1d9012
--- /dev/null
+++ b/pkg/libfido2/patch/0001-Rename-log_-symbols-to-prevent-conflict-when-linking.patch
@@ -0,0 +1,41 @@
+From 448eaf9f2d065bcf76c0c9e253a24f743032ddba Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sun, 3 Nov 2019 11:37:52 -0800
+Subject: [PATCH] Rename log_* symbols to prevent conflict when linking
+ statically
+
+---
+ src/extern.h | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/src/extern.h b/src/extern.h
+index 2f69094..a6c757d 100644
+--- a/src/extern.h
++++ b/src/extern.h
+@@ -92,14 +92,17 @@ int rx_cbor_status(fido_dev_t *, int);
+ #define log_xxd(...) do { /* nothing */ } while (0)
+ #else
+ #ifdef __GNUC__
+-void log_init(void);
+-void log_debug(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
+-void log_xxd(const void *, size_t);
++void fido_log_init(void);
++void fido_log_debug(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
++void fido_log_xxd(const void *, size_t);
+ #else
+-void log_init(void);
+-void log_debug(const char *, ...);
+-void log_xxd(const void *, size_t);
++void fido_log_init(void);
++void fido_log_debug(const char *, ...);
++void fido_log_xxd(const void *, size_t);
+ #endif /* __GNUC__ */
++#define log_init fido_log_init
++#define log_debug fido_log_debug
++#define log_xxd fido_log_xxd
+ #endif /* FIDO_NO_DIAGNOSTIC */
+
+ /* u2f */
+--
+2.23.0
+
diff --git a/pkg/libfido2/patch/0002-hid_linux-Use-sysfs-instead-of-libudev.patch b/pkg/libfido2/patch/0002-hid_linux-Use-sysfs-instead-of-libudev.patch
new file mode 100644
index 00000000..1d69becc
--- /dev/null
+++ b/pkg/libfido2/patch/0002-hid_linux-Use-sysfs-instead-of-libudev.patch
@@ -0,0 +1,192 @@
+From 8cd6f18a9435ced27e765cb8d50991097a00d8c1 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Fri, 1 Nov 2019 19:39:45 -0700
+Subject: [PATCH] hid_linux: Use sysfs instead of libudev
+
+---
+ src/hid_linux.c | 102 ++++++++++++++++++------------------------------
+ 1 file changed, 37 insertions(+), 65 deletions(-)
+
+diff --git a/src/hid_linux.c b/src/hid_linux.c
+index 9d55453..2a888e5 100644
+--- a/src/hid_linux.c
++++ b/src/hid_linux.c
+@@ -9,8 +9,8 @@
+ #include <sys/ioctl.h>
+ #include <linux/hidraw.h>
+
++#include <dirent.h>
+ #include <fcntl.h>
+-#include <libudev.h>
+ #include <string.h>
+ #include <unistd.h>
+
+@@ -147,23 +147,20 @@ is_fido(const char *path)
+ }
+
+ static int
+-parse_uevent(struct udev_device *dev, int16_t *vendor_id, int16_t *product_id)
++parse_uevent(const char *path, int16_t *vendor_id, int16_t *product_id)
+ {
+- const char *uevent;
+- char *cp;
+- char *p;
+- char *s;
++ FILE *fp;
++ char *p = NULL;
++ size_t n = 0;
+ int ok = -1;
+ short unsigned int x;
+ short unsigned int y;
+
+- if ((uevent = udev_device_get_sysattr_value(dev, "uevent")) == NULL)
++ fp = fopen(path, "r");
++ if (!fp)
+ return (-1);
+
+- if ((s = cp = strdup(uevent)) == NULL)
+- return (-1);
+-
+- for ((p = strsep(&cp, "\n")); p && *p != '\0'; (p = strsep(&cp, "\n"))) {
++ while (getline(&p, &n, fp) >= 0) {
+ if (strncmp(p, "HID_ID=", 7) == 0) {
+ if (sscanf(p + 7, "%*x:%hx:%hx", &x, &y) == 2) {
+ *vendor_id = (int16_t)x;
+@@ -174,50 +171,32 @@ parse_uevent(struct udev_device *dev, int16_t *vendor_id, int16_t *product_id)
+ }
+ }
+
+- free(s);
+-
++ free(p);
++ fclose(fp);
+ return (ok);
+ }
+
+ static int
+-copy_info(fido_dev_info_t *di, struct udev *udev,
+- struct udev_list_entry *udev_entry)
++copy_info(fido_dev_info_t *di, const char *name)
+ {
+- const char *name;
+- const char *path;
+- const char *manufacturer;
+- const char *product;
+- struct udev_device *dev = NULL;
+- struct udev_device *hid_parent;
+- struct udev_device *usb_parent;
+- int ok = -1;
++ char path[PATH_MAX];
++ int r, ok = -1;
+
+ memset(di, 0, sizeof(*di));
+
+- if ((name = udev_list_entry_get_name(udev_entry)) == NULL ||
+- (dev = udev_device_new_from_syspath(udev, name)) == NULL ||
+- (path = udev_device_get_devnode(dev)) == NULL ||
+- is_fido(path) == 0)
+- goto fail;
+-
+- if ((hid_parent = udev_device_get_parent_with_subsystem_devtype(dev,
+- "hid", NULL)) == NULL)
++ snprintf(path, sizeof(path), "/dev/%s", name);
++ if (is_fido(path) == 0)
+ goto fail;
++ di->path = strdup(path);
+
+- if ((usb_parent = udev_device_get_parent_with_subsystem_devtype(dev,
+- "usb", "usb_device")) == NULL)
++ r = snprintf(path, sizeof(path), "/sys/class/hidraw/%s/device/uevent", name);
++ if (r < 0 || (size_t)r >= sizeof(path))
+ goto fail;
+-
+- if (parse_uevent(hid_parent, &di->vendor_id, &di->product_id) < 0 ||
+- (manufacturer = udev_device_get_sysattr_value(usb_parent,
+- "manufacturer")) == NULL ||
+- (product = udev_device_get_sysattr_value(usb_parent,
+- "product")) == NULL)
++ if (parse_uevent(path, &di->vendor_id, &di->product_id) < 0)
+ goto fail;
+
+- di->path = strdup(path);
+- di->manufacturer = strdup(manufacturer);
+- di->product = strdup(product);
++ di->manufacturer = strdup("Unknown");
++ di->product = strdup("Unknown");
+
+ if (di->path == NULL ||
+ di->manufacturer == NULL ||
+@@ -226,9 +205,6 @@ copy_info(fido_dev_info_t *di, struct udev *udev,
+
+ ok = 0;
+ fail:
+- if (dev != NULL)
+- udev_device_unref(dev);
+-
+ if (ok < 0) {
+ free(di->path);
+ free(di->manufacturer);
+@@ -239,14 +215,17 @@ fail:
+ return (ok);
+ }
+
++static int
++filter_hidraw(const struct dirent *d)
++{
++ return strncmp(d->d_name, "hidraw", 6) == 0;
++}
++
+ int
+ fido_dev_info_manifest(fido_dev_info_t *devlist, size_t ilen, size_t *olen)
+ {
+- struct udev *udev = NULL;
+- struct udev_enumerate *udev_enum = NULL;
+- struct udev_list_entry *udev_list;
+- struct udev_list_entry *udev_entry;
+- int r = FIDO_ERR_INTERNAL;
++ struct dirent **entries;
++ int i, n, r = FIDO_ERR_INTERNAL;
+
+ *olen = 0;
+
+@@ -256,29 +235,22 @@ fido_dev_info_manifest(fido_dev_info_t *devlist, size_t ilen, size_t *olen)
+ if (devlist == NULL)
+ return (FIDO_ERR_INVALID_ARGUMENT);
+
+- if ((udev = udev_new()) == NULL ||
+- (udev_enum = udev_enumerate_new(udev)) == NULL)
++ n = scandir("/sys/class/hidraw", &entries, filter_hidraw, alphasort);
++ if (n == -1)
+ goto fail;
+-
+- if (udev_enumerate_add_match_subsystem(udev_enum, "hidraw") < 0 ||
+- udev_enumerate_scan_devices(udev_enum) < 0 ||
+- (udev_list = udev_enumerate_get_list_entry(udev_enum)) == NULL)
+- goto fail;
+-
+- udev_list_entry_foreach(udev_entry, udev_list) {
+- if (copy_info(&devlist[*olen], udev, udev_entry) == 0) {
++ for (i = 0; i < n; ++i) {
++ if (copy_info(&devlist[*olen], entries[i]->d_name) == 0) {
+ if (++(*olen) == ilen)
+ break;
+ }
++ free(entries[i]);
+ }
++ for (; i < n; ++i)
++ free(entries[i]);
++ free(entries);
+
+ r = FIDO_OK;
+ fail:
+- if (udev_enum != NULL)
+- udev_enumerate_unref(udev_enum);
+- if (udev != NULL)
+- udev_unref(udev);
+-
+ return (r);
+ }
+
+--
+2.23.0
+