Merge pull request #11905 from poettering/catalog-fixes

various catalog fixes
This commit is contained in:
Lennart Poettering
2019-03-07 21:37:56 +01:00
committed by GitHub
2 changed files with 45 additions and 47 deletions
+44 -46
View File
@@ -33,7 +33,7 @@ const char * const catalog_file_dirs[] = {
NULL
};
#define CATALOG_SIGNATURE (uint8_t[]) { 'R', 'H', 'H', 'H', 'K', 'S', 'L', 'P' }
#define CATALOG_SIGNATURE { 'R', 'H', 'H', 'H', 'K', 'S', 'L', 'P' }
typedef struct CatalogHeader {
uint8_t signature[8]; /* "RHHHKSLP" */
@@ -209,34 +209,38 @@ int catalog_file_lang(const char* filename, char **lang) {
return 1;
}
static int catalog_entry_lang(const char* filename, int line,
const char* t, const char* deflang, char **lang) {
static int catalog_entry_lang(
const char* filename,
unsigned line,
const char* t,
const char* deflang,
char **ret) {
size_t c;
char *z;
c = strlen(t);
if (c < 2)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"[%s:%u] Language too short.",
filename, line);
"[%s:%u] Language too short.", filename, line);
if (c > 31)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"[%s:%u] language too long.", filename,
line);
"[%s:%u] language too long.", filename, line);
if (deflang) {
if (streq(t, deflang)) {
log_warning("[%s:%u] language specified unnecessarily",
filename, line);
log_warning("[%s:%u] language specified unnecessarily", filename, line);
return 0;
} else
log_warning("[%s:%u] language differs from default for file",
filename, line);
}
log_warning("[%s:%u] language differs from default for file", filename, line);
}
*lang = strdup(t);
if (!*lang)
return -ENOMEM;
z = strdup(t);
if (!z)
return -ENOMEM;
*ret = z;
return 0;
}
@@ -367,32 +371,33 @@ int catalog_import_file(Hashmap *h, const char *path) {
return 0;
}
static int64_t write_catalog(const char *database, struct strbuf *sb,
CatalogItem *items, size_t n) {
CatalogHeader header;
static int64_t write_catalog(
const char *database,
struct strbuf *sb,
CatalogItem *items,
size_t n) {
_cleanup_fclose_ FILE *w = NULL;
int r;
_cleanup_free_ char *d, *p = NULL;
_cleanup_free_ char *p = NULL;
CatalogHeader header;
size_t k;
int r;
d = dirname_malloc(database);
if (!d)
return log_oom();
r = mkdir_p(d, 0775);
r = mkdir_parents(database, 0755);
if (r < 0)
return log_error_errno(r, "Recursive mkdir %s: %m", d);
return log_error_errno(r, "Failed to create parent directories of %s: %m", database);
r = fopen_temporary(database, &w, &p);
if (r < 0)
return log_error_errno(r, "Failed to open database for writing: %s: %m",
database);
zero(header);
memcpy(header.signature, CATALOG_SIGNATURE, sizeof(header.signature));
header.header_size = htole64(ALIGN_TO(sizeof(CatalogHeader), 8));
header.catalog_item_size = htole64(sizeof(CatalogItem));
header.n_items = htole64(n);
header = (CatalogHeader) {
.signature = CATALOG_SIGNATURE,
.header_size = htole64(ALIGN_TO(sizeof(CatalogHeader), 8)),
.catalog_item_size = htole64(sizeof(CatalogItem)),
.n_items = htole64(n),
};
r = -EIO;
@@ -420,7 +425,7 @@ static int64_t write_catalog(const char *database, struct strbuf *sb,
goto error;
}
fchmod(fileno(w), 0644);
(void) fchmod(fileno(w), 0644);
if (rename(p, database) < 0) {
r = log_error_errno(errno, "rename (%s -> %s) failed: %m", p, database);
@@ -503,10 +508,10 @@ int catalog_update(const char* database, const char* root, const char* const* di
}
static int open_mmap(const char *database, int *_fd, struct stat *_st, void **_p) {
_cleanup_close_ int fd = -1;
const CatalogHeader *h;
int fd;
void *p;
struct stat st;
void *p;
assert(_fd);
assert(_st);
@@ -516,35 +521,28 @@ static int open_mmap(const char *database, int *_fd, struct stat *_st, void **_p
if (fd < 0)
return -errno;
if (fstat(fd, &st) < 0) {
safe_close(fd);
if (fstat(fd, &st) < 0)
return -errno;
}
if (st.st_size < (off_t) sizeof(CatalogHeader)) {
safe_close(fd);
if (st.st_size < (off_t) sizeof(CatalogHeader))
return -EINVAL;
}
p = mmap(NULL, PAGE_ALIGN(st.st_size), PROT_READ, MAP_SHARED, fd, 0);
if (p == MAP_FAILED) {
safe_close(fd);
if (p == MAP_FAILED)
return -errno;
}
h = p;
if (memcmp(h->signature, CATALOG_SIGNATURE, sizeof(h->signature)) != 0 ||
if (memcmp(h->signature, (const uint8_t[]) CATALOG_SIGNATURE, sizeof(h->signature)) != 0 ||
le64toh(h->header_size) < sizeof(CatalogHeader) ||
le64toh(h->catalog_item_size) < sizeof(CatalogItem) ||
h->incompatible_flags != 0 ||
le64toh(h->n_items) <= 0 ||
st.st_size < (off_t) (le64toh(h->header_size) + le64toh(h->catalog_item_size) * le64toh(h->n_items))) {
safe_close(fd);
munmap(p, st.st_size);
return -EBADMSG;
}
*_fd = fd;
*_fd = TAKE_FD(fd);
*_st = st;
*_p = p;
+1 -1
View File
@@ -51,7 +51,7 @@ static int run(int argc, char *argv[]) {
if (buf_size < POOL_SIZE_MIN)
buf_size = POOL_SIZE_MIN;
r = mkdir_parents_label(RANDOM_SEED, 0755);
r = mkdir_parents(RANDOM_SEED, 0755);
if (r < 0)
return log_error_errno(r, "Failed to create directory " RANDOM_SEED_DIR ": %m");