diff options
author | Jakob Kaivo <jkk@ung.org> | 2020-11-17 20:32:26 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2020-11-17 20:32:26 -0500 |
commit | 78d6a052fc6431ad45ff3a24461fd7744a3c1c28 (patch) | |
tree | 421b9ba21dad14eee3094de81618734e58009bd4 /genkey.c | |
parent | dbd1640b9f41dd0699e5ac09df6f0b1f2a607bdb (diff) |
enforce device type of mmcblk, fail if /sys/block/<device>/device is not a readable directory
Diffstat (limited to 'genkey.c')
-rw-r--r-- | genkey.c | 26 |
1 files changed, 14 insertions, 12 deletions
@@ -1,8 +1,12 @@ +#define _XOPEN_SOURCE 700 #include <ctype.h> +#include <fcntl.h> #include <stdio.h> #include <string.h> #include <stdbool.h> #include <stdlib.h> +#include <unistd.h> + #include "deonebook.h" #define SCR_SIZE 8 @@ -34,27 +38,25 @@ static unsigned char twiddle(unsigned char buf[2]) return c; } -static bool get_sd_register(const char *dev, const char *reg, size_t n, unsigned char buf[n]) +static bool get_sd_register(int dirfd, const char *reg, size_t n, unsigned char buf[n]) { - char path[256]; - snprintf(path, sizeof(path), "/sys/block/%s/device/%s", dev, reg); - - FILE *f = fopen(path, "r"); - if (f == NULL) { + int fd = openat(dirfd, reg, O_RDONLY); + if (fd == -1) { return false; } for (size_t i = 0; i < n; i++) { unsigned char hex[2]; - fread(hex, 2, 1, f); + read(fd, hex, sizeof(hex)); buf[i] = twiddle(hex); } - fclose(f); + close(fd); + return true; } -unsigned char * genkey(const char *dev) +unsigned char * genkey(int dirfd) { static unsigned char key[KEY_SIZE]; const unsigned char keycode[] = "eone"; @@ -65,15 +67,15 @@ unsigned char * genkey(const char *dev) unsigned char csd[CSD_SIZE] = "testtesttesttest"; unsigned char cid[CID_SIZE] = "testtesttesttest"; - if (!get_sd_register(dev, "cid", sizeof(cid), cid)) { + if (!get_sd_register(dirfd, "cid", sizeof(cid), cid)) { fprintf(stderr, "warning: CID register not read\n"); allread = false; } - if (!get_sd_register(dev, "csd", sizeof(csd), csd)) { + if (!get_sd_register(dirfd, "csd", sizeof(csd), csd)) { fprintf(stderr, "warning: CSD register not read\n"); allread = false; } - if (!get_sd_register(dev, "scr", sizeof(scr), scr)) { + if (!get_sd_register(dirfd, "scr", sizeof(scr), scr)) { fprintf(stderr, "warning: SCR register not read\n"); allread = false; } |