Merge pull request #11905 from poettering/catalog-fixes
various catalog fixes
This commit is contained in:
+44
-46
@@ -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;
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user